MySQL-Tag-Frage: Wie wähle ich ein Element aus, das als X, Y und Z markiert wurde?

Ich habe es mit einer Datenbank zu tun, in der Elemente eine bestimmte Anzahl von Malen "markiert" werden.

Artike (100k Zeilen)

Ich würdNamandere Sache

Etiket (10k Zeilen)

Ich würdNam

item2tag (1.000.000 Zeilen)

Artikel Identifikationsnumme tag_idAnzah

Ich suche die schnellste Lösung für:

Wählen Sie Elemente aus, die mit X, Y und Z markiert wurden (wobei X, Y und Z (möglicherweise) Markierungsnamen entsprechen)?

Hier ist, was ich bisher habe ... Ich möchte nur sicherstellen, dass ich es bestmöglich mache:

Zunächst die tag_ids aus den Namen abrufen:

SELECT tag.id WHERE name IN ("X","Y","Z");

Dann gruppiere ich nach diesen tag_ids und benutze Having, um das Ergebnis zu filtern:

SELECT item2tag.*, count(tag_id)
  FROM item2tag
  WHERE tag_id=1 or tag_id=2 or tag_id=3
GROUP BY item_id
HAVING count(tag_id)=3;

Dann kann ich einfach einen Artikel mit diesen IDs auswählen.

SELECT * FROM item WHERE id IN ([results from prior query])

Ich habe Millionen von Zeilen in item2tag mit einem Index für (item_id, tag_id). Wird dies die schnellste Lösung sein?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage