Vinzenz Mai: MYSQL Bedingungen verschachteln

Beitrag lesen

Hallo

Versuche ich das jetzt allerdings so aufzubauen, dass ich das Fahrzeug herausbekomme, das über Inventar an Belegung hängt, bekomme ich etwas, das aussieht wie ein Kreuzprodukt über alle 4 Tabellen. Mein SQL dazu sieht so aus:

Du solltest Klammern setzen :-)

SELECT * FROM fahrzeug, inventar , belegung, standort WHERE
inventar.id=belegung.inventar_id
AND START < '2007-01-27'AND ende < '2007-01-27'
OR START > '2007-02-28' AND ende > '2007-02-28'
AND inventar.id= fahrzeug.inventar_id
AND standort.id=inventar.standort_id

Ich würde gerne wissen, wie ich es schaffe der DB klar zu machen welche Bedingungen zusammengehören und wo diese durch OR getrennt werden. Was mache ich falsch?

Ich persönlich bevorzuge die explizite Join-Syntax:

  
SELECT  
    <spaltenliste>        -- Ich vermeide SELECT *, wo immer ich kann  
                          -- und wähle nur die Spalten aus, die ich wirklich  
                          -- benötige  
FROM fahrzeug f           -- Aliasnamen sparen Schreibarbeit ;-)  
INNER JOIN inventar i     -- Explizite Joinsyntax  
ON f.inventar_id = i.id  
INNER JOIN standort s  
ON s.id = i.standort_id  
INNER JOIN belegung b  
ON i.id = b.inventar_id  
-- Es folgen jede Menge redundanter Klammern  
-- Hättest Du das äußere Klammerpaar um Deine Zeiteinschränkungen gesetzt,  
-- sollte Dein Statement das gewünschte Ergebnis liefern.  
WHERE ((START < '2007-01-27'AND ende < '2007-01-27')  
    OR (START > '2007-02-28' AND ende > '2007-02-28'))  

Für mich sind SQL-Statements mit expliziter JOIN-Syntax leichter lesbar, da JOIN-Bedingungen und Einschränkung der Ergebnismenge (WHERE-Klausel) sauber getrennt sind.

Wenn Du die Ergebnismenge weiter einschränken willst, so beachte, dass dann die äußeren Klammern, die in meiner WHERE-Klausel stehen, notwendig sind. Gleiches gilt, wenn Du die implizite JOIN-Syntax weiter verwenden willst.

Freundliche Grüße

Vinzenz