微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在分组内排序?

如何解决在分组内排序?

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
        )

应该去 。在类似(但更复杂)的问题中查看他的答案:

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

        ORDER BY
                pi.close_date DESC

解决方法

在我的系统中,我有客户。客户有程序。我想显示一个客户端列表,显示其最近的活动(如果存在)程序。

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

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

这似乎给出正确的结果。这是正确的,还是我很幸运?即,我基本上已经在对表进行排序之前对其进行了排序;这些结果将像连接一样保持排序,对吗?


解决方案:
我现在认为这是一个经典的基于组的最大问题。如果您遇到类似问题,请进行搜索。解决方案包括将同一张表连接两次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。