Hi!
Ich habs hingekriegt!
Effizienz und Eleganz sieht anders aus. Für jeden neuen Suchbegriff fügst du zwei ineinander geschachtelte Subselects ein. Das ergibt schon bei deinem Beispiel (laut EXPLAIN) 5 abzuarbeitenden Schritte.
SELECT *
FROM pictures
WHERE id IN
(
SELECT picture_id
FROM picture_tag
WHERE tag_id IN
(
SELECT id
FROM tags
WHERE name IN ('abc', 'def')
)
GROUP BY picture_id
HAVING COUNT(*) >= 2
)
Das sind schon mal nur noch konstant drei Schritte. Oder sogar nur zwei, denn wenn du nur die ID vom Bild brauchst, kannst du die äußere Abfrage weglassen. Die 2 bei HAVING muss jeweils der Anzahl der Tags angepasst werden. Und wenn du es richtig machst, wird auch der PHP-Teil kleiner, der in die Abfrage die Tags und ihre Anzahl einfügt.
Lo!