Pozwól, że podsumuję to, co zrozumiałem:chciałbyś wybrać każdy bilet i jego ostatnie rozwiązanie.
Lubię używać następującego wzorca do tego rodzaju pytań, ponieważ unika on wzorca podzapytania i dlatego jest raczej dobry tam, gdzie potrzebna jest wydajność. Wadą jest to, że jest to trochę trudne do zrozumienia:
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;
Napisałem tylko sedno wzoru dla lepszego zrozumienia.
Klucze to:
-
LEWE ZŁĄCZENIE
solutions
tabela ze sobą zs1.ticket_id = s2.ticket_id
warunek:emulujeGROUP BY ticket_id
. -
warunek
s2.id > s1.id
:jest to SQL dla "Chcę tylko ostatniego rozwiązania", emulujeMAX()
. Założyłem, że w twoim modeluthe last
oznaczawith the greatest id
ale możesz użyć tutaj warunku na dacie. Zauważ, żes2.id < s1.id
da ci pierwsze rozwiązanie. -
klauzula WHERE
s2.id IS NULL
:najdziwniejszy, ale absolutnie niezbędny... przechowuje tylko te rekordy, które chcesz.
Spróbuj i daj mi znać :)
Edytuj 1: Właśnie zdałem sobie sprawę, że drugie założenie było zbytnim uproszczeniem problemu. To sprawia, że jest jeszcze ciekawiej :p Próbuję zobaczyć, jak ten wzorzec może działać z Twoją date, id
zamawianie.
Edytuj 2: Ok, działa świetnie z niewielkim skrętem. Warunek LEFT JOIN staje się:
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))