dipps
Goto Top

SQL ORDER BY und Join mit 2 Tabellen

Hallo an alle,
ich versuche gerade eine Join mit 2 Tabellen auf zubauen und mir den letzten Datensatz Anzeigen zu lassen.
Hier mal die Tabellen

tbl.Geraete
m_id [int] (PK)
inventar [varchar]
Preis
Bemerkung
...

tbl.Daten
m_id [int](FK)(PK)
DatumZeit [snaldatetime](PK)
BH1
BH2
BH3
BH4
Digi1
Digi2
Position
Speed

SQL:
SELECT Geraete.Inventarnr ,DatumZeit,Bh1,Bh2,Bh3,Bh4,Digi1,Digi2,Position ,Speed FROM Daten JOIN Geraete ON Daten.m_id = Geraete.m_id Order BY DatumZeit
Nun würde mir die Abfrage jedes Gerät mit jedem Datensatz Anzeigen.
Ich möchte aber gerne nur von jeder Maschiene den neusten (DatumZeit) Datensatz angezeigt bekommen.

Content-ID: 333356

Url: https://administrator.de/contentid/333356

Ausgedruckt am: 25.11.2024 um 12:11 Uhr

emeriks
emeriks 27.03.2017 um 09:35:29 Uhr
Goto Top
Hi,
schau mal hier, ich hatte ne ähnliche Frage.

E.
ukulele-7
Lösung ukulele-7 27.03.2017 um 15:16:17 Uhr
Goto Top
Das könnte z.B. so gehen:
SELECT	Geraete.Inventarnr,DatumZeit,Bh1,Bh2,Bh3,Bh4,Digi1,Digi2,Position,Speed
FROM	( SELECT m_id,max(DatumZeit) AS DatumZeit FROM Geraete GROUP BY m_id ) t
INNER JOIN Geraete
ON		t.m_id = Geraete.m_id
INNER JOIN Daten
ON		t.m_id = Daten.m_id
AND		t.DatumZeit = Daten.DatumZeit
ORDER BY Geraete.Inventarnr
Gut wäre es zu wissen welches SQL du einsetzt, vielleicht geht es auch eleganter.
eisbein
eisbein 28.03.2017 um 06:30:57 Uhr
Goto Top
Hallo!

Schau dir noch einmal die Syntax-Beschreibung von ORDER BY an. Da gibt es noch Parameter ASC und DESC für die Sortierreihenfolge.
In deinem Fall ist DESC (absteigende Sortierung) angebracht.

Weiter schau dir die Syntax-Beschreibung für LIMIT an.

Deine Abfrage könnte dann evtl. so aussehen:
SELECT Geraete.Inventarnr ,DatumZeit,Bh1,Bh2,Bh3,Bh4,Digi1,Digi2,Position ,Speed FROM Daten JOIN Geraete ON Daten.m_id = Geraete.m_id Order BY DatumZeit DESC LIMIT 1

Gruß
eisbein
ukulele-7
ukulele-7 28.03.2017 um 08:33:33 Uhr
Goto Top
Zitat von @eisbein:

Schau dir noch einmal die Syntax-Beschreibung von ORDER BY an. Da gibt es noch Parameter ASC und DESC für die Sortierreihenfolge.
In deinem Fall ist DESC (absteigende Sortierung) angebracht.

Weiter schau dir die Syntax-Beschreibung für LIMIT an.

Er möchte einen Datensatz pro Gerät, nicht nur einen Datensatz. LIMIT ist außerdem nicht in jedem SQL möglich.
eisbein
eisbein 28.03.2017 um 09:43:05 Uhr
Goto Top
Sorry, mein Fehler - hab ich überlesen. face-sad
Dipps
Dipps 28.03.2017 um 11:52:02 Uhr
Goto Top
Danke ukulele-7 so geht es anbei nochmal der Code ohne Fehler:
SELECT	Geraete.Inventarnr,DatumZeit,Bh1,Bh2,Bh3,Bh4,Digi1,Digi2,Position,Speed
FROM	( SELECT m_id,max(DatumZeit) AS DatumZeit2 FROM Daten GROUP BY m_id ) t
INNER JOIN Geraete
ON		t.m_id = Geraete.m_id
INNER JOIN Daten
ON		t.m_id = Daten.m_id
AND		t.DatumZeit2 = Daten.DatumZeit
ORDER BY Geraete.Inventarnr
ukulele-7
ukulele-7 28.03.2017 um 14:19:56 Uhr
Goto Top
Okay das DatumZeit einen doppelten Spaltennamen ergibt ist mir entgangen. Du hättest aber auch, statt DatumZeit2 zu verwenden, im Select-Teil den Tabellennamen bzw. Tabellenalias mit angeben können (also t.DatumZeit oder Daten.DatumZeit). Das ist bei solchen Abfragen definitiv sauberer.