В моей системе у меня есть клиенты. У клиентов есть программы. Я хочу отобразить список клиентов, показывающий их последнюю активную (если она существует) программу.
Таким образом, у нас есть что-то вроде этого:
SELECT *
FROM clients AS client
JOIN programs AS program ON client.id=program.client_id
GROUP BY client.id
ORDER BY program.close_date=0 DESC, program.close_date DESC
close_date = 0
означает, что программа не закрыта. Таким образом, сначала будут размещены незамкнутые программы, а затем последние закрытые программы.
Проблема в том, что порядок по не работает внутри групп. Он просто выбирает одну из программ наугад. Как мне решить эту проблему?
Только что придумал:
SELECT *
FROM clients AS client
JOIN (SELECT * FROM programs AS program ORDER BY program.close_date=0 DESC, program.close_date DESC) AS program ON client.id=program.client_id
GROUP BY client.id
Что, кажется, дает правильные результаты. Это правильно, или мне просто повезло? т.е. я по сути отсортировал таблицу перед тем, как присоединиться к ней; эти результаты останутся отсортированными по мере объединения, верно?
Решение: Теперь я считаю, что это классическая групповая проблема максимума . Ищите это, если вы застряли на подобной проблеме. Решение состоит в том, чтобы дважды соединить одну и ту же таблицу.