Anzeige

MySQL Abfrage über mehrere Tabellen

#1
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.
 

melmager

Erfahrenes Mitglied
#2
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
 

Zvoni

Erfahrenes Mitglied
#4
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
 
#5
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

Zvoni

Erfahrenes Mitglied
#6
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
 
#7
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.
 

EuroCent

KlappStuhl 2.0
#10
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 :)
 

Zvoni

Erfahrenes Mitglied
#11
Geht nicht, da du keine Aggregat-Funktion verwendest.

Die Idee mit dem GROUP BY ist aber definitiv richtig.
Frage: Solle die Ausgabe pro Tag sein? Dazu müsstest du uns aber den Aufbau des Zeitstempels genauer erklären, weil aus dem werde ich nicht schlau
 

Zvoni

Erfahrenes Mitglied
#13
Na Halleluja dann.
Der PHP-Timestamp ist die vergangene Zeit in Sekunden (!!) seit dem 01. Januar 1970. Jetzt stellt sich die Frage, ob MySQL das umformatieren kann, sonst wirds hässlich (=von Hand umrechnen um aufs Datum zu kommen)
 
#14
meines wissens kann man per MySQL UNIX Timestamp umwandeln...
SQL:
SELECT 
DATE_FORMAT(FROM_UNIXTIME(lpr_linienankunft.zeitpunkt),'%d.%m.%Y') AS LinienankunftDatum ,
DATE_FORMAT(FROM_UNIXTIME(lpr_linienankunft.zeitpunkt),'%H:%i:%s') AS Linienankunft,
 

Zvoni

Erfahrenes Mitglied
#19
Schau mal ob es so ppasst:
SQL:
SELECT
lpr_benutzer.benutzer_id AS BID,
lpr_benutzer.name AS Vorname,
lpr_benutzer.nachname AS Nachname,
max(date_format(FROM_UNIXTIME(lpr_linienanmeldung.zeitpunkt),'%d.%m.%Y')) AS Anmeldung,
max(date_format(FROM_UNIXTIME(lpr_linienhupabfahrt.zeitpunkt),'%d.%m.%Y')) AS HubAbfahrt,
max(date_format(FROM_UNIXTIME(lpr_linienankunft.zeitpunkt),'%d.%m.%Y')) 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, Vorname, Nachname
 
Anzeige
Anzeige