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