Maison  >  Article  >  base de données  >  Comment sélectionner efficacement des éléments appartenant à plusieurs catégories dans une table MySQL ?

Comment sélectionner efficacement des éléments appartenant à plusieurs catégories dans une table MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-31 04:11:31316parcourir

How to Efficiently Select Items Belonging to Multiple Categories in a MySQL Table?

Identification des éléments dans plusieurs catégories

Problème :

Dans une table MySQL contenant des informations associatives (item_id etcategory_id), l'objectif est de sélectionner uniquement les éléments présents dans un ensemble spécifié de catégories.

Exemple :

Étant donné le tableau :

+-----------------------+
| item_id | category_id |
+-----------------------+
|   1     |    200      |
|   1     |    201      |
|   1     |    202      |
|   2     |    201      |
|   2     |    202      |
|   3     |    202      |
|   3     |    203      |
|   4     |    201      |
|   4     |    207      |
+-----------------------+

Si les ID de catégorie 201 et 202 sont transmis, la requête ne doit renvoyer que les éléments 1 et 2, car ce sont les seuls présents dans les deux catégories.

Solution 1 : Auto -Join

SELECT c1.item_id
FROM item_category AS c1
INNER JOIN item_category AS c2 ON c1.item_id = c2.item_id
WHERE c1.category_id = 201 AND c2.category_id = 202

Cette technique nécessite une auto-jointure qui crée un produit cartésien de la table, ce qui peut être inefficace pour les grands ensembles de données.

Solution 2 : GROUP BY et HAVING

SELECT c.item_id, COUNT(*) AS cat_count
FROM item_category AS c
WHERE c.category_id IN (201,202)
GROUP BY c.item_id
HAVING cat_count = 2

Cette solution utilise GROUP BY et HAVING pour compter le nombre de catégories pour chaque élément et filtrer celles qui correspondent à l'ensemble spécifié. Il fonctionne mieux pour les ensembles de données plus volumineux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn