Mysql join ODER where


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Sprint

Erfahrenes Mitglied
#1
Hallo zusammen,

ich habe hier ein Problem mit einer Abfrage, bei der sich JOIN und WHERE gegenseitig blockieren. Es geht um eine Tabelle mit Fahrzeugen, die auf zweierlei Wegen verkauft werden können.
1. Das Fahrzeug wird über das System verkauft. In dem Fall ist seine Nummer in den Kaufverträgen zu finden. In der folgenden Abfrage das letzte JOIN.
2. Das Fahrzeug wird nicht über das System verkauft. Das wird daran erkannt, daß es eines Tages in den Daten von mobile.de nicht mehr auftaucht. Dann wird ein Kennzeichen "mobile_geloescht" in der kfz Tabelle gesetzt.

Es gibt jetzt aber eine Abfrage, die nur die verkauften Fahrzeuge auflisten soll und da müssen natürlich auch die gelistet werden, die nicht über das System liefen. Sollte also mit einem "WHERE mobile_geloescht = 1" erledigt sein. Allerdings blockieren sich diese WHERE Bedingung und das JOIN zu den Kaufverträgen gegenseitig.

Die einfachste Abfrage könnte z.B. so aussehen:
SQL:
SELECT
    kf.kfzid,
    kf.intnr,
    kf.fin,
    m.marke,
    mo.modellname,
    kf.ind_modell,
    kf.variante,
    kfa.aussenfarbe,
    kfa.metallic,
    kfd.leistung,
    kfd.ez,
    kfz.km,
    kf.preis,
    kf.ausweisbar,
    kv.userid,
    kv.kaufdatum,
    kv.kdnr
FROM kfz kf
    JOIN kfzausstattung kfa ON kf.kfzid = kfa.kfzid
    JOIN kfzdaten kfd ON kf.kfzid = kfd.kfzid
    JOIN kfzzustand kfz ON kf.kfzid = kfz.kfzid
    JOIN mmarken m ON kf.hersteller = m.markenr
    JOIN mmodelle mo ON kf.modell = mo.modellid
    JOIN kaufvertrag kv ON kf.kfzid = kv.kfzid and kv.storno = 0
WHERE
    kf.hersteller = 'Ford' AND
    kf.mobile_geloescht = 1
So lange da aber das JOIN auf den Kaufvertrag drin ist, wird kein Datensatz angezeigt, der "gelöscht" wurde.

Gibt es eine Möglichkeit, das beides zu verbinden? Ein späteres Ausfiltern wie bei einer Abfrage auf "verfügbar" funktioniert ja auch nicht, da die betroffenen Datensätze erst gar nicht gelesen werden.

Vielen Dank schon mal im Voraus,
Sprint
 

Yaslaw

n/a
Moderator
#2
Ein einfacher JOIN ist immer ein INNER JOIN. und ein INNER JOIN kann man auch über WHERE verknüpfen
Zum Beispiel so:
SQL:
FROM kfz kf,
    kfzausstattung kfa,
    kfzdaten kfd,
    kfzzustand kfz,
    mmarken m,
    mmodelle mo
    kaufvertrag kv
WHERE
    kf.kfzid = kfa.kfzid
    AND kf.kfzid = kfd.kfzid
    AND kf.kfzid = kfz.kfzid
    AND kf.hersteller = m.markenr
    AND kf.modell = mo.modellid
    AND (
            (
                kf.kfzid = kv.kfzid
                AND kv.storno = 0
            ) OR kf.mobile_geloescht = 1
        )
    AND kf.hersteller = 'Ford'
Oder mittels LEFT JOIN
SQL:
FROM kfz kf
    JOIN kfzausstattung kfa ON kf.kfzid = kfa.kfzid
    JOIN kfzdaten kfd ON kf.kfzid = kfd.kfzid
    JOIN kfzzustand kfz ON kf.kfzid = kfz.kfzid
    JOIN mmarken m ON kf.hersteller = m.markenr
    JOIN mmodelle mo ON kf.modell = mo.modellid
    LEFT JOIN kaufvertrag kv ON kf.kfzid = kv.kfzid 
WHERE
    kf.hersteller = 'Ford'
    AND (
        kv.storno = 0
        OR ( 
            kv.kfzid IS NULL
            AND kf.mobile_geloescht = 1
        )
    )
 

Sprint

Erfahrenes Mitglied
#6
Ich hab die JOIN genommen, da alles andere in dem Script auch damit aufgebaut ist. Ich hatte erst einmal meine eigenen fruchtlosen Versuche rückgängig machen müssen und nachdem es dann funktionierte, hab ich die andere nicht mehr eingebaut.
Testweise hab ich aber die WHERE mal per Hand zusammengebaut und auch da hab ich Ergebnisse bekommen.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…