# Catégories et leurs sous-catégories utilisant OU

**URL:** https://meta.discourse.org/t/categories-and-their-subcategories-using-or/276583
**Category:** Data & reporting
**Tags:** sql-query, sql-tutorial
**Created:** [Août 25, 2023, 8:37 UTC](https://meta.discourse.org/t/categories-and-their-subcategories-using-or/276583 "2023-08-25T08:37:03Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [Août 25, 2023, 8:37 UTC](https://meta.discourse.org/t/categories-and-their-subcategories-using-or/276583/1 "2023-08-25T08:37:03Z")

</div>

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)

```sql
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 :

```sql
-- [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 :

```sql
-- [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 :

```sql
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. 🙂
