Markus: SELECT MIT JOIN

Hallo zusammen,

ich habe zwei mysql Tabellen -> kunden_main und kunden_status.

In kunden_main gibt es folgende Felder:
km_id
km_vorname
km_name
...

In kunden_status gibt es folgende Felder:
ks_id
ks_km_id (Die ID aus kunden_main / Fremschlüssel)
ks_status
ks_datum (Datum, wann der Status gesetzt wurde)

Die Daten sind in zwei Tabellen getrennt, da der Status der Kunden dauernd wechselt und ich so eine Art Historie erstellen möchte.

Nun möchte ich auf dem Bildschirm eine Liste mit allen Kundendaten ausgeben + den jeweils aktuellen Status (ID, Vorname, Name, Status, Datum).

Die Datenbankabfrage zum Erstellen der Liste möchte ich gerne ohne Schleife ausführen. Das heißt kunden_main und kunden_status sollen mit einem SELECT Befehl ausgelesen werden (JOIN). Funktioniert auch wunderbar, aber leider zeigt er mir für jeden Eintrag in kunden_status einen Datensatz an und nicht nur für den aktuellsten. Ich habe auch schon mit GROUP BY, DISTINCT, MAX und HAVING rumgespielt, aber scheinbar bin ich zu doof.

BITTE HELFT MIR!

MERCI, Markus

  1. Hallo Markus,

    In kunden_main gibt es folgende Felder:
    km_id
    km_vorname
    km_name
    ...

    In kunden_status gibt es folgende Felder:
    ks_id
    ks_km_id (Die ID aus kunden_main / Fremschlüssel)
    ks_status
    ks_datum (Datum, wann der Status gesetzt wurde)

    Nun möchte ich auf dem Bildschirm eine Liste mit allen Kundendaten ausgeben + den jeweils aktuellen Status (ID, Vorname, Name, Status, Datum).

    Die Datenbankabfrage zum Erstellen der Liste möchte ich gerne ohne Schleife ausführen. Das heißt kunden_main und kunden_status sollen mit einem SELECT Befehl ausgelesen werden (JOIN). Funktioniert auch wunderbar, aber leider zeigt er mir für jeden Eintrag in kunden_status einen Datensatz an und nicht nur für den aktuellsten.

    Du benötigst eine korrelierte Unterabfrage, sprich Deine MySQL-Version sollte >= 4.1 sein. Deswegen ist es bei MySQL-Fragen immer eine gute Idee, die Version mitanzugeben. Folgendes ungetestetes Statement sollte es tun:

    SELECT  
      k.km_id,  
      k.km_vorname,  
      -- ...  
      s.ks_status,  
      s.ks_datum  
    FROM kunden_main k  
    INNER JOIN kunden_status ks  
    ON k.km_id = s.ks_km_id  
    WHERE s.ks_datum = (SELECT MAX(ks_datum) FROM kunden_status ks WHERE ks.ks_km_id = s.ks_km_id)  
    
    

    Ist Deine Version älter, so kann Dir vielleicht folgender Archivthread weiterhelfen.

    Freundliche Grüße

    Vinzenz

    1. Vielen Dank! Genau danach habe ich gesucht!
      Beim zweiten WHERE war zwar noch ein kleiner Fehler, aber ohne Deine Hilfe hätte ich es nie geschafft

  2. yo,

    BITTE HELFT MIR!

    in ganz dringenden fällen rate ich zur nummer 110, bzw. 112. ansonsten hilft vor allem ruhe bewahren . ;-)

    ks_km_id (Die ID aus kunden_main / Fremschlüssel)

    da ist schon mal das erste problem. du kennst deine ist-situation genauer. aber in aller regel ist die beziehung zwischen kunde und status so, dass ein kunde einen status besitzt und umgekehrt ein und derselbe status mehrere kunden besitzen kann. das würde bedeuten, dass der fremdschlüssel in die kunden-tabelle gehört. bei deinem daten-design ist es so, dass ein kunde mehrere stati besitzen kann, aber ein status nur einen kunden. und eine historie kannst du anders darstellen. aber das würde ich schnellstens korrigieren.

    Die Daten sind in zwei Tabellen getrennt, da der Status der Kunden dauernd wechselt und ich so eine Art Historie erstellen möchte.

    der grund mehrerer tabellen ist in aller regel die art der abhängigkeiten der daten untereinander. und wie oben beschrieben ist der fremschlüssel in der falschen tabelle, bzw. die beziehungen falsch gesetzt.

    relationale datenbanken stellen in aller regel den ist-zustand dar. will man den faktor zeit mit rein bringen (historie), so muss man dafür geeignete strukturen mit reinbringen. eine möglichkeit wäre, eine dritte tabelle zu erstellen, die dann nämlich diese n:m beziehung abbilden kann, sprich jeder kunde kann zu unterschiedlichen zeiten mehrere stati besitzen und ein status mehrere kunden. und dann wird auch deutlich, wie sich der pk schlüssel der n:m beziehungstabelle bildet, nämlich aus den pk derbeiden tabellen + einem datum, bzw. mit date/time falls es sich täglich mehrmals wechselt.

    und wenn du das gemacht hast, dann kann man sich noch mal über die abfrage unterhalten....

    Ilja