dipps

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.
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 333356

Url: https://administrator.de/forum/sql-order-by-und-join-mit-2-tabellen-333356.html

Ausgedruckt am: 02.06.2025 um 11:06 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.