Categorias e suas Subcategorias usando OU

Às vezes, você quer encontrar informações sobre tópicos que estão em certas categorias, mais todos os tópicos nas subcategorias dessas categorias também. Você pode adicionar o category_id de cada subcategoria à sua consulta, mas isso pode produzir uma lista bem longa dependendo da sua configuração de categorias/subcategorias. :slight_smile:

Um método alternativo é adicionar a tabela categories e usar OR:
(Certifique-se de alterar o valor para ser o da sua categoria pai)

SELECT 
    t.category_id,
    t.id AS topic_id
FROM topics t
  JOIN categories c ON c.id = t.category_id
WHERE (c.id = 5 OR c.parent_category_id = 5)

Você também pode usar isso com um parâmetro:

-- [params]
-- int :category_id

SELECT 
    t.category_id,
    t.id AS topic_id
FROM topics t
  JOIN categories c ON c.id = t.category_id
WHERE (c.id = :category_id OR c.parent_category_id = :category_id)

E para alterá-lo para múltiplas categorias com subcategorias, você pode trocar o parâmetro por uma versão int_list e adaptar sua consulta para usar IN assim:

-- [params]
-- int_list :category_id

SELECT 
    t.category_id,
    t.id AS topic_id
FROM topics t
  JOIN categories c ON c.id = t.category_id
WHERE (c.id IN (:category_id) OR c.parent_category_id IN (:category_id))

Ou codificar as categorias pai diretamente na consulta:

SELECT 
    t.category_id,
    t.id AS topic_id
FROM topics t
  JOIN categories c ON c.id = t.category_id
WHERE (c.id IN (4, 5) OR c.parent_category_id IN (4, 5))

Essas consultas são principalmente exemplos para demonstrar os princípios. Espero que as ache úteis, mas se tiver alguma dúvida, por favor, pergunte abaixo. :slight_smile:

7 curtidas