Позволете ми да обобщя това, което разбрах:бихте искали да изберете всеки билет и последното му решение.
Харесва ми да използвам следния модел за този вид въпроси, тъй като избягва модела на подзаявката и следователно е доста добър, когато е необходима производителност. Недостатъкът е, че е малко трудно да се разбере:
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;
Написах само сърцето на шаблона за по-добро разбиране.
Ключовете са:
-
LEFT JOIN на
solutions
таблица със себе си сs1.ticket_id = s2.ticket_id
условие:емулираGROUP BY ticket_id
. -
условието
s2.id > s1.id
:това е SQL за "Искам само последното решение", той емулираMAX()
. Предполагах, че във вашия модел,the last
означаваwith the greatest id
но можете да използвате тук условие за датата. Имайте предвид, чеs2.id < s1.id
ще ви даде първото решение. -
клаузата WHERE
s2.id IS NULL
:най-странното, но абсолютно необходимо... съхранява само записите, които искате.
Опитайте и ме уведомете :)
Редактиране 1: Току-що разбрах, че второто предположение опростява проблема. Това го прави още по-интересно :p Опитвам се да видя как този модел може да работи с вашия date, id
поръчване.
Редактиране 2: Добре, работи чудесно с малко обрат. Условието на LEFT JOIN става:
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))