В моей системе у меня есть клиенты.У клиентов есть программы.Я хочу отобразить список клиентов, показывая их последнюю активную (если она существует) программу.
Таким образом, у нас есть что-то вроде этого:
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
Что, похоже, дает правильные результаты.Это правильно, или мне просто везет?то есть я, по сути, отсортировал таблицу перед тем, как присоединиться к ней;эти результаты останутся отсортированными, как и при объединении, верно?
Решение: Теперь я считаю, что это классическая групповая максимальная проблема.Ищите это, если вы застряли на аналогичной проблеме.Решение состоит в том, чтобы дважды объединить одну и ту же таблицу.