Lassen Sie mich zusammenfassen, was ich verstanden habe:Sie möchten jedes Ticket und seine letzte Lösung auswählen.
Ich verwende gerne das folgende Muster für diese Art von Frage, da es das Unterabfragemuster vermeidet und daher ziemlich gut ist, wenn Leistung benötigt wird. Der Nachteil ist, dass es etwas schwierig zu verstehen ist:
SELECT
t.*,
s1.*
FROM tickets t
INNER JOIN solutions s1 ON t.id = s1.ticket_id
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id AND s2.id > s1.id
WHERE s2.id IS NULL;
Zum besseren Verständnis habe ich nur das Herz des Musters geschrieben.
Die Schlüssel sind:
-
der LEFT JOIN der
solutions
Tabelle mit sich selbst mit dems1.ticket_id = s2.ticket_id
Bedingung:Es emuliert dieGROUP BY ticket_id
. -
die Bedingung
s2.id > s1.id
:Es ist das SQL für "Ich will nur die letzte Lösung", es emuliert denMAX()
. Ich bin davon ausgegangen, dass in Ihrem Modellthe last
bedeutetwith the greatest id
aber Sie könnten hier eine Bedingung für das Datum verwenden. Beachten Sie, dasss2.id < s1.id
würde Ihnen die erste Lösung geben. -
die WHERE-Klausel
s2.id IS NULL
:das Seltsamste, aber absolut Notwendige... hält nur die Aufzeichnungen, die Sie wollen.
Probieren Sie es aus und lassen Sie es mich wissen :)
Änderung 1: Ich habe gerade festgestellt, dass die zweite Punktannahme das Problem zu sehr vereinfacht. Das macht es noch interessanter :p Ich versuche zu sehen, wie dieses Muster mit Ihrem date, id
funktionieren könnte Bestellung.
Änderung 2: Ok, mit einem kleinen Twist funktioniert es super. Die Bedingung für den LEFT JOIN wird zu:
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id
AND (s2.date > s1.date OR (s2.date = s1.date AND s2.id > s1.id))