Dovolte mi shrnout, co jsem pochopil:chtěli byste vybrat každý tiket a jeho poslední řešení.
Rád používám pro tento druh otázky následující vzor, protože se vyhýbá vzoru poddotazu, a je tedy spíše dobrý tam, kde je potřeba výkon. Nevýhodou je, že je to trochu složitější na pochopení:
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;
Pro lepší pochopení jsem napsal pouze jádro vzoru.
Klíče jsou:
-
LEVÝ SPOJ
solutions
tabulka sama se sebou ss1.ticket_id = s2.ticket_id
podmínka:emulujeGROUP BY ticket_id
. -
podmínku
s2.id > s1.id
:je to SQL pro "chci jen poslední řešení", emulujeMAX()
. Předpokládal jsem, že ve vašem modelu je tothe last
znamenáwith the greatest id
ale můžete zde použít podmínku data. Všimněte si, žes2.id < s1.id
by vám poskytlo první řešení. -
klauzule WHERE
s2.id IS NULL
:ten nejpodivnější, ale naprosto nezbytný... uchovává pouze záznamy, které chcete.
Zkuste to a dejte mi vědět :)
Úprava 1: Právě jsem si uvědomil, že druhý bodový předpoklad problém příliš zjednodušuje. Díky tomu je to ještě zajímavější :p Snažím se zjistit, jak tento vzor může fungovat s vaším date, id
objednávání.
Úprava 2: Dobře, funguje to skvěle s malým otočením. Podmínka na LEFT JOIN se stane:
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))