在我的系统中,我有客户。客户有程序。我想显示一个客户列表,显示它们最近的活动(如果存在)程序。
因此,我们有这样的事情:
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-wise maximum问题。如果您遇到类似问题,请搜索该问题。解决方案包括两次加入同一个表。
答案 0 :(得分: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
)
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
答案 1 :(得分:1)
尝试这个按条款排序......
ORDER BY client.id, CASE WHEN program.close_date = 0 THEN 0 ELSE 1 END, program.close_date DESC