Заказать в группе? - PullRequest
       24

Заказать в группе?

9 голосов
/ 29 августа 2011

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

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

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

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


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

Ответы [ 2 ]

7 голосов
/ 29 августа 2011
SELECT  c.*, p.*
FROM    clients AS c
JOIN    programs AS p
ON      p.id = 
        (
        SELECT  pi.id
        FROM    programs AS pi
        WHERE   pi.client_id = c.id
        ORDER BY
                pi.close_date=0 DESC, pi.close_date DESC
        LIMIT 1
        )

Спасибо, следует перейти к @ Quassnoi . См. Его ответ в похожем (но более сложном) вопросе: mysql-group-to-to-display-latest-result


Если вы обновите таблицу programs и установите для всех записей значение close_date, которое равно нулю, равному close_date='9999-12-31', то ваш ORDER BY будет проще (и весь запрос будет быстрее с правильными индексами):

        ORDER BY
                pi.close_date DESC
1 голос
/ 29 августа 2011

Попробуйте этот порядок по пункту ...

ORDER BY client.id, CASE WHEN program.close_date = 0 THEN 0 ELSE 1 END, program.close_date DESC
...