Moin zusammen,
ich versuche gerade unsere Anwendung etwas performanter zu machen.
Dazu wollte ich zwei SQL-Aufrufe zu einem zusammenfassen.
Meine erste SQL sieht in etwa folgendermaßen aus:
SELECT
guid,
SomeValue,
timestamp_edit,
SuperID,
datensatz_status
FROM
Tabelle_1
WHERE
((datensatz_status = 0) OR (datensatz_status = 1))
ORDER BY
timestamp_save, guid
LIMIT 150 OFFSET 0
Nun durchlaufe ich in meinem Programm die Datensätze, schreibe die Werte jeweils weg und führe dann aber für alle Datensätze folgende Query aus:
SELECT
SomeValue2
FROM
Tabelle_2
WHERE
(SuperID2 = :TheID)
ORDER BY
timestamp_save DESC
LIMIT 1
Mein Problem ist, dass ich beim Zusammenführen keine Idee habe, wie ich ein vernünftiges Join machen kann, welches das Limit beachtet.
Ich will pro Datensatz der ersten Tabelle ja nur den neusten der zweiten Tabelle haben.
Nach langem rumprobieren bin ich hier gelandet:
SELECT
a.*, b.SomeValue2
FROM
(
SELECT
guid,
timestamp_edit,
timestamp_save,
SomeValue,
SuperID,
datensatz_status
FROM
Tabelle_1
WHERE
((datensatz_status = 0) OR (datensatz_status = 1))
LIMIT 150 OFFSET 0
) a
LEFT JOIN
(
SELECT
SomeValue2,
timestamp_save,
SuperID2
FROM
Tabelle_2
WHERE
timestamp_save in (SELECT MAX(timestamp_save) as Val FROM Tabelle_2 GROUP BY SuperID2)
) b
ON a.SuperID = b.SuperID2
ORDER BY
a.timestamp_save, a.guid
Damit bekomme ich in meinen Testdaten zwar genau das richtige Ergebnis, aber die
timestamp_edit und timestamp_save-Felder sind nicht unique, so dass das neuste timestamp_save von SuperID2 = ‘abc’ auch gleichzeitig das falsche timestamp_save von SuperID2 = ‘123’ sein kann. Zum Einen, weil ich in Funktionen oft hingehe und nur einmal den Zeitstempel ermittle und diesen dann an mehreren Stellen wieder verwende, zum Anderen, weil mehrere Client-PCs in die Tabelle schreiben können.
Anmerkung: Ich habe die SQLs für leichteres Verständnis gekürzt und Feld sowie Tabellennamen angepasst, weil ich nicht weiß, wie das Datenschutztechnisch ein Problem sein könnte.
Ich hoffe, dass mir hierbei keine Tippfehler passiert sind.
Anmerkung 2: Das ganze sollte auch funktionieren, wenn es keinen passenden Datensatz in der zweiten Tabelle gibt (Feld = null).
Hat jemand die “richtige” Lösung für dieses Problem? Meine ist ja nicht “richtig”.
Vielleicht kann ich das mit einer allgemeinen Antwort selbst lösen, wenn jemand die Antwort auf die Frage hat “Wie kann ich zwei SQLs zusammenführen bei der die erste SQL Datensätze ermittelt und die zweite SQL den jeweils aktuellsten Datensatz aus einer zweiten Tabelle dazu laden muss?” (Wenn die Frage so korrekt gestellt ist.) Aber ich habe zumindest nichts zu dieser Fragestellung finden können.
Liebe Grüße aus dem Norden
Incocnito