Question

J'ai besoin d'une requête SQL qui récupère tous les éléments qui ont les deux balises, pas une des balises. J'ai déjà une requête mais renvoie tous les éléments contenant les deux balises, pas le résultat attendu. Retrouvez la description détaillée ci-dessous. Merci!

Structure de la table:

ITEMS TABLE
------------
item_id
item_name

TAGS TABLE
----------
tag_id
tag_name

ITEMTAGS TABLE
---------------
tag_id
item_id

Requête:

SELECT Items.* FROM Items 
INNER JOIN ItemTags ON Items.item_id = ItemTags.item_id
WHERE ItemTags.tag_id IN (T1, T2)
GROUP BY Items.item_id

Résultat: Tous les articles qui ont T1 ou T2

Résultat attendu: Tous les articles qui ont à la fois T1 et T2

Était-ce utile?

La solution

select i.*
from items i, itemtags it1, itemtags it2
where i.item_id=it1.item_id and it1.tag_id=T1
and i.item_id=it2.item_id and it2.tag_id=T2;

Autres conseils

Si votre base de données prend en charge le mot clé intersect (SqlServer, par exemple), vous pouvez écrire:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
/* intersection between items that have the tag T1 
   and the ones that have the tag T2 */ 
(
    SELECT item_id FROM ItemTags WHERE tag_id = T1
    INTERSECT 
    SELECT item_id FROM ItemTags WHERE tag_id = T2
)

Si ce n'est pas le cas, vous devrez faire quelque chose comme:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
(
    SELECT ItemTags1.item_id 
    FROM ItemTags as ItemTags1 
        INNER JOIN ItemTags as ItemTags2 
        ON ItemTags1.item_id = ItemTags2.item_id 
    WHERE 
            ItemTags1.tag_id = T1
        AND ItemTags2.tag_id = T2
)

Lors de la deuxième requête, résolvez les problèmes de performances possibles en raison de ItemTags1.item_id = ItemTags2.item_id. Vous aurez besoin d’un index sur la clé étrangère pour bien fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top