组内订购的?组内订购的?(Order within group by?)

2019-05-12 03:16发布

在我的系统,我有客户。 客户有计划。 我想显示的客户名单,显示出他们最近活跃的(如果存在)的程序。

因此,我们有这样的事情:

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

这似乎给出正确的结果。 这是正确的,还是我刚刚幸运吗? 也就是说,我已经基本上排序表连接上之前; 这些结果将保持排序的,因为它确实的加入,对不对?


解决方案:现在我相信这是一个经典的分组方式最大的问题。 搜索,如果你被困在一个类似的问题。 该解决方案包括加入同一个表两次。

Answer 1:

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的组,通过对显示最新型结果


如果更新programs表,并设置close_date的所有记录,它是零close_date='9999-12-31' ,那么你的ORDER BY会更简单(和整个查询适当的索引更快):

        ORDER BY
                pi.close_date DESC


Answer 2:

BY子句试试这个顺序...

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


文章来源: Order within group by?