Lad mig opsummere, hvad jeg forstod:Du vil gerne vælge hver billet og dens sidste løsning.
Jeg kan godt lide at bruge følgende mønster til denne slags spørgsmål, da det undgår underforespørgselsmønsteret og derfor er ret godt, hvor der er behov for ydeevne. Ulempen er, at det er lidt svært at forstå:
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;
Jeg skrev kun hjertet af mønsteret for en bedre forståelse.
Nøglerne er:
-
VENSTRE JOIN af
solutions
tabel med sig selv meds1.ticket_id = s2.ticket_id
betingelse:den emulererGROUP BY ticket_id
. -
betingelsen
s2.id > s1.id
:det er SQL'en for "Jeg vil kun have den sidste løsning", den emulererMAX()
. Jeg antog, at i din model,the last
betyderwith the greatest id
men du kan her bruge en betingelse om datoen. Bemærk, ats2.id < s1.id
ville give dig den første løsning. -
WHERE-sætningen
s2.id IS NULL
:den mærkeligste, men absolut nødvendig... holder kun de optegnelser, du ønsker.
Prøv og fortæl mig :)
Rediger 1: Jeg indså lige, at det andet punkt antagelse oversimplificerede problemet. Det gør det endnu mere interessant :p Jeg prøver at se, hvordan dette mønster kan fungere med din date, id
bestilling.
Rediger 2: Ok, det fungerer godt med et lille twist. Betingelsen på LEFT JOIN bliver:
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))