Frage

Ich brauche eine SQL-Abfrage, die alle Elemente abruft, die beide Tags, nicht von Tags. Ich habe bereits eine Abfrage aber gibt alle Elemente, die beide Tags hove, nicht erwartete Ergebnis. Unten finden Sie detaillierte Beschreibung. Dank!

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 hat

Erwartetes Ergebnis: Alle Elemente, die sowohl T1 und T2

haben
War es hilfreich?

Lösung

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;

Andere Tipps

Wenn Ihre Datenbank des intersect Schlüsselwort unterstützt (SqlServer tut) Sie schreiben können:

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:

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 werden einen Index für die Fremdschlüssel müssen gut funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top