MySQL Abfrage über 3 Tabellen

haz3

Grünschnabel
Hallo zusammen, folgende Sache:

Ich schreibe gerade an einem Tool, auf welchem man zuerst den Kunden und danach die Reparatur zu dem jeweiligem Kunden erfasst.
Das funktioniert alles ohne Probleme.
Jedoch kann der Erfasser später eine sogenannte Spalte "Status" bearbeiten.
Zum Schluss, wenn der "Status" auf abgeschlossen steht, kann der Erfasser einen Bericht erstellen lassen, welchen jeden geänderten Status mitsamt Datum anzeigt.

BSP.

Kunde: Hans Muster
Adresse: XXX
Status: Reparatur anstehend (X.X.14)
Status: Blabla (X.X.14)
Status: Abgeschlossen (X.X.14)

usw.

Ich habe für diesen Zweck 3 Tabellen:

tblReparatur
tblReparaturStatus
tblStatus

Der Erfasser kann im tool eine Tabellenansicht der momentanen Bestellungen auswählen.
Die anzeige ist soweit auch ok, nur ein grosses Problem habe ich; Nach dem der Status bearbeitet wurde, wird für jede Reparatur nicht der neue Status angezeigt, sondern einfach jedes Update separat. Um es grafisch zu verdeutlichen:

Tabelle jetzt:
Reparatur IDGeraetModellStatus
1LaptopXAuftrag angenommen
2LaptopXAuftrag angenommen
1LaptopXReparatur anstehend

Wie es sein sollte:
Reparatur IDGeraetModellStatus
1LaptopXReparatur anstehend
2LaptopXAuftrag angenommen

Momentan bringt mir folgende Abfrage "die besten" Resultate

SQL:
SELECT idtblReparatur, geraethersteller, modell, seriennr, beschreibung, Status, max(idtblStatus), name, vorname

FROM tblReparatur AS tblRep, tblKunde AS tblKu, tblStatus AS tblStat, tblReparaturStatus AS tblRepStat

WHERE tblKu.idtblKunde = tblRep.fktblKunde
AND tblStat.idtblStatus = tblRepStat.fktblStatus
AND tblRep.idtblReparatur = tblRepStat.fktblReparatur
AND tblStat.Status = (SELECT Status FROM tblStatus ORDER BY idtblStatus DESC LIMIT 1)

ORDER BY idtblReparatur ASC

Jedoch ist hier das Problem, das es mir dann nur noch wirklich den aller letzten veränderten Status und die damit verknüpfte Reparatur anzeigt und alle anderen nicht mehr...

Würde mich über Hilfe freuen :)

MfG
 
Zuletzt bearbeitet von einem Moderator:
Ich hab's noch nicht verstanden. Kannst du mal ein Beispiel machen mit Daten in den 4 Tabellen und was du am Ende erwarten würdest?
 
Guten Morgen

Klar, mach ich.

Also, 3 Tabellen

tblReparatur

Erfasst werden:
  • idtblReparatur (AutoInkrementell, PK)
  • Geraetehersteller
  • Modell
  • Beschreibung

tblStatus

Erfasst werden:

  • idtblStatus (AutoInkrementell, PK)
  • Status
  • geaendertAm (DATE)

tblReparaturStatus

Erfasst werden:
  • fktblReparatur
  • fktblStatus

Wie man sehen kann, soll die Tabelle tblReparaturStatus die Verknüpfung n:m von tblStatus zu tblReparatur gewährleisten.
Ich muss jeden einzelnen Status abspeichern, da ich diese Später in einem Bericht nacheinander angezeigt werden haben will, so das man sehen kann, zu welchem Zeitpunkt der Status abgeändert worden ist. Im OriginalPost habe ich das im ersten Abschnitt bereits erläutert.

Nun möchte ich die Einträge von tblStatus und tblReparatur anzeigen lassen. Das ist auch kein Problem, nur das es mir den aller ersten eingetragenen Status anzeigt. Sobald ich den Status ändere, sprich einen Neuen Eintrag in der Tabelle tblStatus mache, möchte ich in der Tabelle den neuesten Status angezeigt bekommen.
 
SQL:
SELECT 
  r.*,
  t.*
  
FROM
  tblReparatur as r
LEFT OUTER JOIN
 tblStatus as t
ON
 (t.idtblReparatur = 
  SELECT fktblReparatur FROM tblReparaturStatus WHERE fktblStatus = 
   (SELECT TOP (1) idtblStatus FROM tblStatus ORDER BY geaendertAm DESC
   )
 )
Wie immer ungetestet.
Es wäre aus meiner Sicht allerdings einfacher, wenn Du tblReparaturStatus und tblReparaturStatus zusammenfasst:
•idtblStatus (AutoInkrementell, PK)
•idtblReparatur (FK)
•Status
•geaendertAm (DATE)
 
Danke für das Beispiel, hab ich dann auch gleich probiert - jedoch ohne Erfolg.
Hat mir dann teilweise Einträge mit NULL-Werten angezeigt.

Habe es aber jetzt selbst hingekriegt!
 
Zurück