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
solutionsTabelle mit sich selbst mit dems1.ticket_id = s2.ticket_idBedingung: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 lastbedeutetwith the greatest idaber Sie könnten hier eine Bedingung für das Datum verwenden. Beachten Sie, dasss2.id < s1.idwü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))