Ilja: SQL-Abfrage

Beitrag lesen

yo,

Ich will jetzt nach Autos suchen das die Sonderausstattungen 1,2,3,15 hat.

Wie muss der Query aussehen, damit ich alle Autos bekommen die wenigstens die verlangten Ausstattungen haben, oder auch noch andere?

zum einen handelt es sich bei der tabelle sonder um eine m:n beziehungstabelle. und dabei sind die spaltennamen sehr ungünstig gewählt, auch kann man sich eine spalte sparen. mein vorschlag:

auto_id | sonder_id

beide spalten zusammen bilden dann den primäschlüssel.

allerdings gibt es noch eine besser lösung, dich ich dir empfehlen würde. in deinem falle würde ich die beziehungstabelle ganz auflösen und die jeweiligen sonderausstattungen als attribute mit in die erste tabelle auto nehmen. dann würde sich deine abfrage auch ganz von alleine lösen.

sicherlich kann man das kritisch sehen, aber in deinem falle geht das, weil die anzahl der unterschiedlichen sonderausstattungen endlich ist. außerdem spart man sich die joins über mehrere tabellen und macht es somit einfacher und schneller. einzig ein wenig mehr speicherplatz kostet es. das ist aber heutzutage nicht wiklrich ein argument.

falls dir das nicht zusagt, dann ist der ansatz von rouven der richtige, er hat ihn allerings nicht richtig umgesetzt. da du vergleiche über mehrere datensätze ausführen musst, gibt es meiner meinung nach nur zwei wege. einen join für jede sonderausstattung, sprich vier joins in deinem fall. dass ist aber sehr umständlich.

besser ist es über group by und count zu machen.

SELECT auto.id, COUNT(*)
FROM auto, sonder
WHERE auto.id = sonder.iid
AND sonder.sid = 1
AND sonder.sid = 2
AND sonder.sid = 3
AND sonder.sid = 15
GROUP BY auto.id
HAVING COUNT(*) = 4

Ilja