Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Kann ich eine Linksverknüpfung durchführen und nur eine Zeile aus der Verknüpfungstabelle ziehen?

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 dem s1.ticket_id = s2.ticket_id Bedingung:Es emuliert die GROUP BY ticket_id .

  • die Bedingung s2.id > s1.id :Es ist das SQL für "Ich will nur die letzte Lösung", es emuliert den MAX() . Ich bin davon ausgegangen, dass in Ihrem Modell the last bedeutet with the greatest id aber Sie könnten hier eine Bedingung für das Datum verwenden. Beachten Sie, dass s2.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))