Laat me samenvatten wat ik heb begrepen:je wilt elk ticket en de laatste oplossing selecteren.
Ik gebruik graag het volgende patroon voor dit soort vragen omdat het het subquerypatroon vermijdt en daarom redelijk goed is waar prestaties nodig zijn. Het nadeel is dat het een beetje lastig te begrijpen is:
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;
Ik heb alleen het hart van het patroon geschreven voor een beter begrip.
De sleutels zijn:
-
de LEFT JOIN van de
solutions
tabel met zichzelf met des1.ticket_id = s2.ticket_id
voorwaarde:het emuleert deGROUP BY ticket_id
. -
de voorwaarde
s2.id > s1.id
:het is de SQL voor "Ik wil alleen de laatste oplossing", het emuleert deMAX()
. Ik nam aan dat in uw model,the last
betekentwith the greatest id
maar je zou hier een voorwaarde voor de datum kunnen gebruiken. Merk op dats2.id < s1.id
zou je de eerste oplossing geven. -
de WHERE-clausule
s2.id IS NULL
:de raarste maar absoluut noodzakelijk... bewaart alleen de records die u wilt.
Probeer het en laat het me weten :)
Bewerken 1: Ik realiseerde me net dat de veronderstelling van het tweede punt het probleem te eenvoudig maakte. Dat maakt het nog interessanter :p Ik probeer te zien hoe dit patroon kan werken met je date, id
bestellen.
Bewerken 2: Ok, het werkt geweldig met een kleine twist. De voorwaarde op de LEFT JOIN wordt:
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))