首页 > 解决方案 > MySql Group by 但仍显示所有行

问题描述

我有以下数据库

ID 图像名 测试结果 样品参考 上传时间 订单号
1 文件名1.png 无效的 ABC123 2021-08-19 12:00 1002
2 文件名2.png 无效的 ABC123 2021-08-19 13:00 1001
3 文件名3.png 无效的 ABC123 2021-08-19 14:00 1002
4 文件名4.png 无效的 ABC123 2021-08-19 15:00 1001

我正在使用 SQL 查询

SELECT * 
FROM results 
WHERE imagename IS NOT NULL 
  AND testresult IS NULL 
  AND sampleref LIKE 'LAT%' 
ORDER BY testresult IS NULL DESC, uploadedat 
LIMIT 25

但是我想按(但不是聚合分组)分组orderid,以便结果显示为

ID 图像名 测试结果 样品参考 上传时间 订单号
1 文件名1.png 无效的 ABC123 2021-08-19 12:00 1002
3 文件名3.png 无效的 ABC123 2021-08-19 14:00 1002
2 文件名2.png 无效的 ABC123 2021-08-19 13:00 1001
4 文件名4.png 无效的 ABC123 2021-08-19 15:00 1001

在这里,我们最初按顺序排序,uploadedat但随后显示其余结果,匹配orderid基本上将它们分组在一起,但仍显示每一行。

我不能使用ORDER BY orderid, uploadedat,因为这会将第 2 行和第 4 行放在第 1 行和第 3 行之上

解决方案是什么?是否使用 2 个选择语句,第一个选择 * 并在 orderid 和 orderby 上载at 上进行分组,然后在 orderid = $Row ['orderid'] 处没有分组的第二个?或者有没有办法为此在单个语句中执行 JOIN 或双重选择?

谢谢?

标签: mysqlsqlsubquerysql-order-bywindow-functions

解决方案


您想首先按uploadedat每个orderid.

如果您的 MySql 版本是 8.0+,您可以使用MIN()窗口函数:

SELECT * 
FROM results
WHERE imagename IS NOT NULL 
  AND testresult IS NULL 
ORDER BY MIN(uploadedat) OVER (PARTITION BY orderid),
         uploadedat

对于以前的版本,使用相关子查询:

SELECT r1.* 
FROM results r1
WHERE r1.imagename IS NOT NULL 
  AND r1.testresult IS NULL 
ORDER BY (SELECT MIN(r2.uploadedat) FROM results r2 WHERE r2.orderid = r1.orderid),
         r1.uploadedat

演示


推荐阅读