2009-03-06 9 views
2

Ich brauche eine SQL-Abfrage, die alle Elemente abruft, die beide Tags haben, keine Tags. Ich habe bereits eine Abfrage, aber gibt alle Elemente zurück, die beide Tags enthielten, nicht erwartetes Ergebnis. Finden Sie detaillierte Beschreibung unten. Vielen Dank!Abrufen von Datensätzen mit Tag T1 und T2

Tabellenstruktur:

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

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

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

Abfrage:

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 

Ergebnis: Alle Elemente, die T1 oder T2

Erwartetes Ergebnis haben: Alle Elemente, die sowohl T1 und T2 haben

Antwort

3
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; 
0

Wenn Ihre Datenbank die Inters unterstützt

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 
) 

Wenn nicht, müssen Sie so etwas wie tun: ect Schlüsselwort (SqlServer tut) können Sie schreiben

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 
) 

Auf den zweiten Abfrage kümmern mögliche Performance-Probleme wegen ItemTags1.item_id = ItemTags2.item_id. Sie benötigen einen Index für den Fremdschlüssel, um gut zu funktionieren.

+0

mysql nicht unterstützt dies, wie ich – matte

+0

@Mert wissen: gut, wenn ich gepostet habe es wurde mit dem Stichwort ‚SQL‘ nicht ‚mysql‘ :) – Aleris

Verwandte Themen