A volte si desidera trovare informazioni su argomenti che si trovano in determinate categorie, più tutti gli argomenti nelle sottocategorie di tali categorie. È possibile aggiungere il category_id di ciascuna sottocategoria alla query, ma questo può produrre un elenco piuttosto lungo a seconda della configurazione delle categorie/sottocategorie. ![]()
Un metodo alternativo è aggiungere la tabella categories e usare OR:
(Assicurati di modificare il valore in modo che sia quello della tua categoria padre)
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)
Puoi anche usarlo con un parametro:
-- [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 per modificarlo per più categorie con sottocategorie, puoi sostituire il parametro con una versione int_list e adattare la tua query per usare IN in questo modo:
-- [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))
Oppure codificare le categorie padre direttamente nella query stessa:
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))
Queste query sono principalmente esempi per dimostrare i principi. Speriamo che li trovi utili, ma se hai domande, chiedi qui sotto. ![]()