Die gewählte Antwort von Martin Smith
SELECT PageID
FROM pagetags
WHERE TagID IN (1, 2, 4)
GROUP BY PageID
HAVING Count(DISTINCT TagID) = 3
korrekt ist, aber wenn die Geschwindigkeit ein Problem dann versuchen, diese ist.
Ich habe eine große Tabelle, die die gleiche Sache macht und 10x bessere Leistung mit dem folgenden bekam.
0,2 Sekunden im Vergleich zu 2,0 Sekunden für die Abfrage, die 272 aus einer Tabelle mit 3 Millionen Zeilen zurückgibt.
Auch getestet auf einer größeren Tabelle mit 5 Tags und gleich 10x aber jetzt 0,5 gegenüber 5,0.
Index ist PageID, TagID mit Millionen von PageID und Hunderte von TagID.
Häufiges Szenario, in dem viele Objekte mit mehrwertigen Eigenschaften gekennzeichnet sind.
SELECT distinct(p1.PageID)
FROM pagetags p1
JOIN pagetags p2
ON p2.PageID = p1.PageID
AND p2.TagID = 2
JOIN pagetags p3
ON p3.PageID = p1.PageID
AND p3.TagID = 4
WHERE p1.PageID = 1
ORDER BY p1.PageID
oder
SELECT distinct(PageID)
FROM pagetags
WHERE TagID = 1
INTERSECT
SELECT distinct(PageID)
FROM pagetags
WHERE TagID = 2
INTERSECT
SELECT distinct(PageID)
FROM pagetags
WHERE TagID = 4
ORDER BY PageID
Ziehe die zuletzt als mit über 5 schließt sich der Abfrage-Optimierer oft einige schlechte Entscheidungen treffen.
Und damit haben Sie die Gruppe nicht aufgebraucht, wenn Sie es für eine andere Aggregation benötigen.
ok, ich hätte mein ursprüngliches Schema schreiben sollen, denn das ist schwieriger als das obige Beispiel :) Aber du hast mich dort gerettet, danke eine Tonne. – Ali