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-Key: 333356

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

Printed on: April 25, 2024 at 13:04 o'clock

Member: emeriks
emeriks Mar 27, 2017 at 07:35:29 (UTC)
Goto Top
Hi,
schau mal hier, ich hatte ne ähnliche Frage.

E.
Member: ukulele-7
Solution ukulele-7 Mar 27, 2017 at 13:16:17 (UTC)
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.
Member: eisbein
eisbein Mar 28, 2017 at 04:30:57 (UTC)
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
Member: ukulele-7
ukulele-7 Mar 28, 2017 at 06:33:33 (UTC)
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.
Member: eisbein
eisbein Mar 28, 2017 at 07:43:05 (UTC)
Goto Top
Sorry, mein Fehler - hab ich überlesen. face-sad
Member: Dipps
Dipps Mar 28, 2017 at 09:52:02 (UTC)
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
Member: ukulele-7
ukulele-7 Mar 28, 2017 at 12:19:56 (UTC)
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.