MySQL Abfrage über mehrere Tabellen

forum-user

Mitglied
Hallo an Alle Mitglieder.
Ich arbeite derzeit mit vier Tabellen, welche den Aufbau wie folgt haben:

Tabelle1 Benutzer:
Note - alle Felder werden ausgefüllt
Aufbau - benutzer_id, benutzername, name, nachname --> benutzer_id ist prim.Key auto inc.

Tabelle 2 Linienankunft:
Note - wird nur ausgefüllt, wenn Benutzer Linienankunft bestätigt
Aufbau - linien_id, benutzer_id, zeitpunkt, status_mailversand

Tabelle 3 Linienanmeldung

Note - wird nur ausgefüllt, wenn Benutzer Linienanmeldung bestätigt
Aufbau - anmeldung_id, benutzer_id, zeitpunkt, status_mailversand

Tabelle 4 HubAbfahrt
Note - wird nur ausgefüllt, wenn Benutzer Abfahrt bestätigt
Aufbau - hupabfahrt_id, benutzer_id, zeitpunkt, status_mailversand

Nun zu meinem eigentlichen Anliegen.
Ich benötige eine Abfrage, welche mir nach Zeitpunkt (Zeitstempel), Name, Vorname, Linienanmeldung Zeitstempel, HUB Abfahrt Zeitstempel, Lininenankunft Zeitstempel zurück liefert.
Zum Beispiel:
Datum - Name - Vorname - Anmeldung - HUB Abfahrt - Linienankunft
01.02.2018 - Mustermann1 - Max1 - 16:30:34 - 00:13:32 - n/a


unter sqlFiddle habe ich mal das Schema und meinen Ansatz vorbereitet.
 
Nachfrage: Tabelle 2,3,4 haben die untereinander eine 1 zu 1 beziehung ?
wenn ja konnte man die tabellen zu einer machen
ansonsten wird es lustig mit den nötigen joins
 
SQL:
SELECT
lpr_benutzer.name AS Vorname,
lpr_benutzer.nachname AS Nachname,
lpr_linienanmeldung.zeitpunkt AS Anmeldung,
lpr_linienhupabfahrt.zeitpunkt AS HubAbfahrt,
lpr_linienankunft.zeitpunkt AS Ankunft
FROM lpr_benutzer
LEFT JOIN lpr_linienanmeldung
ON lpr_linienanmeldung.benutzer_id = lpr_benutzer.benutzer_id
LEFT JOIN lpr_linienhupabfahrt
ON lpr_linienhupabfahrt.benutzer_id = lpr_benutzer.benutzer_id
LEFT JOIN lpr_linienankunft
ON lpr_linienankunft.benutzer_id = lpr_benutzer.benutzer_id
 
SQL:
SELECT
lpr_benutzer.name AS Vorname,
lpr_benutzer.nachname AS Nachname,
lpr_linienanmeldung.zeitpunkt AS Anmeldung,
lpr_linienhupabfahrt.zeitpunkt AS HubAbfahrt,
lpr_linienankunft.zeitpunkt AS Ankunft
FROM lpr_benutzer
LEFT JOIN lpr_linienanmeldung
ON lpr_linienanmeldung.benutzer_id = lpr_benutzer.benutzer_id
LEFT JOIN lpr_linienhupabfahrt
ON lpr_linienhupabfahrt.benutzer_id = lpr_benutzer.benutzer_id
LEFT JOIN lpr_linienankunft
ON lpr_linienankunft.benutzer_id = lpr_benutzer.benutzer_id


Hierbei ensteht leider eine Dopplung an Einträgen, was ich vermeiden wollte
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    71 KB · Aufrufe: 33
Logisch, du hast ja auch unterschiedliche Einträge z.b. bei Anmeldung.
Vielleicht wenn du genauer erklärst anhand der Beispiele was du als Ergebnis erwartest
 
Logisch, du hast ja auch unterschiedliche Einträge z.b. bei Anmeldung.
Vielleicht wenn du genauer erklärst anhand der Beispiele was du als Ergebnis erwartest

Der Fahrer meldet sich quasi an, Zeitstempel wird mit ID des Fahrers in der Tabelle Anmeldung gespeichert.
Er fährt im Depot los und speichert per Schalter den Zeitstempel und Fahrer ID in der Tabelle Abfahrt.
Das gleiche dann bei der Ankunft, da wird wieder Zeitstempel und Fahrer ID gespeichert. Da es jedoch sein kann, das alle drei Schalter nicht vom selben Fahrer betätigt werden, auf Grund Zusatzfahrzeug etc., wurde sich für diese drei Tabellen und deren Zeitspeicherung entschieden.


Am Ende muss ich für einen statistische Auswertung eine Aufstellung erhalten, welche die genannten Daten enthält.
 
Warum nutzt du nicht Group By damit holst du nur die Datensätze einmal und hast diese nicht doppelt :)
 
Weiß jetzt nicht ob es direkt so funktioniert:
SQL:
SELECT
lpr_benutzer.benutzer_id AS BID
lpr_benutzer.name AS Vorname,
lpr_benutzer.nachname AS Nachname,
lpr_linienanmeldung.zeitpunkt AS Anmeldung,
lpr_linienhupabfahrt.zeitpunkt AS HubAbfahrt,
lpr_linienankunft.zeitpunkt AS Ankunft
FROM lpr_benutzer
LEFT JOIN lpr_linienanmeldung
ON lpr_linienanmeldung.benutzer_id = lpr_benutzer.benutzer_id
LEFT JOIN lpr_linienhupabfahrt
ON lpr_linienhupabfahrt.benutzer_id = lpr_benutzer.benutzer_id
LEFT JOIN lpr_linienankunft
ON lpr_linienankunft.benutzer_id = lpr_benutzer.benutzer_id
GROUP BY BID

Hab es natürlich nicht getestet :)
Sollte aber theoretisch gehen :)
 
Zurück