Låt mig sammanfatta vad jag förstod:du vill välja varje biljett och dess sista lösning.
Jag gillar att använda följande mönster för den här typen av frågor eftersom det undviker subquery-mönstret och är därför ganska bra där prestanda behövs. Nackdelen är att det är lite knepigt att förstå:
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;
Jag skrev bara hjärtat av mönstret för en bättre förståelse.
Nycklarna är:
-
VÄNSTER JOIN för
solutions
tabell med sig själv meds1.ticket_id = s2.ticket_id
villkor:den emulerarGROUP BY ticket_id
. -
villkoret
s2.id > s1.id
:det är SQL för "Jag vill bara ha den sista lösningen", den emulerarMAX()
. Jag antog att i din modell,the last
betyderwith the greatest id
men du kan här använda ett villkor om datumet. Observera atts2.id < s1.id
skulle ge dig den första lösningen. -
WHERE-satsen
s2.id IS NULL
:den konstigaste men absolut nödvändig... håller bara de register du vill ha.
Testa och låt mig veta :)
Redigera 1: Jag insåg precis att det andra antagandet var att förenkla problemet. Det gör det ännu mer intressant :p Jag försöker se hur det här mönstret kan fungera med ditt date, id
beställning.
Redigera 2: Ok, det fungerar utmärkt med en liten twist. Villkoret på LEFT JOIN blir:
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))