Parfois, vous souhaitez trouver des informations sur des sujets qui se trouvent dans certaines catégories, ainsi que tous les sujets de leurs sous-catégories. Vous pouvez ajouter l’ID de catégorie de chaque sous-catégorie à votre requête, mais cela peut produire une liste assez longue en fonction de votre configuration de catégories/sous-catégories. ![]()
Une méthode alternative consiste à ajouter la table categories et à utiliser OR :
(Assurez-vous de modifier la valeur pour qu’elle corresponde à celle de votre catégorie parente)
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)
Vous pouvez également utiliser ceci avec un paramètre :
-- [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)
Et pour l’adapter à plusieurs catégories avec sous-catégories, vous pouvez remplacer le paramètre par une version int_list et adapter votre requête pour utiliser IN comme ceci :
-- [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 coder en dur les catégories parentes dans la requête elle-même :
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))
Ces requêtes sont principalement des exemples pour démontrer les principes. J’espère qu’elles vous seront utiles, mais si vous avez des questions, n’hésitez pas à les poser ci-dessous. ![]()