团体内的订单?

mpe*_*pen 9 mysql greatest-n-per-group

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

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

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这似乎给出了正确的结果.这是正确的,还是我很幸运?也就是说,我在加入之前基本上对表格进行了排序; 这些结果会像加入一样保持排序,对吧?


解决方案:我现在相信这是一个典型的分组最大问题.如果您遇到类似问题,请搜索该问题.该解决方案涉及两次加入同一个表.

ype*_*eᵀᴹ 7

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
        )
Run Code Online (Sandbox Code Playgroud)

Thanx应该去@Quassnoi.在类似(但更复杂)的问题中查看他的答案:mysql-group-by-to-display-latest-result


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

        ORDER BY
                pi.close_date DESC
Run Code Online (Sandbox Code Playgroud)