Заказ внутри группы по?

В моей системе у меня есть клиенты. У клиентов есть программы. Я хочу отобразить список клиентов, показывающий их последнюю активную (если она существует) программу.

Таким образом, у нас есть что-то вроде этого:

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

Что, кажется, дает правильные результаты. Это правильно, или мне просто повезло? т.е. я по сути отсортировал таблицу перед тем, как присоединиться к ней; эти результаты останутся отсортированными по мере объединения, верно?


Решение: Теперь я считаю, что это классическая групповая проблема максимума . Ищите это, если вы застряли на подобной проблеме. Решение состоит в том, чтобы дважды соединить одну и ту же таблицу.

9
задан Community 23 May 2017 в 12:34
поделиться