dedlfix: Unterabfragen als Filter

Beitrag lesen

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!