【问题标题】:MySql Group by but still show all rowsMySql Group by 但仍显示所有行
【发布时间】:2023-04-01 07:15:01
【问题描述】:

我有以下数据库

ID imagename testresult sampleref uploadedat orderid
1 filename1.png NULL ABC123 2021-08-19 12:00 1002
2 filename2.png NULL ABC123 2021-08-19 13:00 1001
3 filename3.png NULL ABC123 2021-08-19 14:00 1002
4 filename4.png NULL 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 imagename testresult sampleref uploadedat orderid
1 filename1.png NULL ABC123 2021-08-19 12:00 1002
3 filename3.png NULL ABC123 2021-08-19 14:00 1002
2 filename2.png NULL ABC123 2021-08-19 13:00 1001
4 filename4.png NULL 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 或双重选择?

谢谢?

【问题讨论】:

  • ORDER BY orderid DESC, uploadedat ASC 会有帮助吗?

标签: mysql sql subquery sql-order-by window-functions


【解决方案1】:

您希望首先按每个 orderid 的最小 uploadedat 排序。

如果你的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

请参阅demo

【讨论】:

    【解决方案2】:

    使用

    ORDER BY orderid desc,uploadedat asc
    

    在 mysql 8.0 中测试

    with cte as
    (
    select 1002 as id ,'2021-08-19 12:00' as upd
    union all
    select 1002 as id ,'2021-08-19 14:00' as upd
    union all
    select 1001 as id ,'2021-08-19 13:00' as upd
    union all
    select 1001 as id ,'2021-08-19 15:00' as upd
    ) select * from cte order by id desc,upd asc
    

    Demo

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多