【问题标题】:How to order by before group by in MYSQL如何在MYSQL中按分组前排序
【发布时间】:2025-11-25 04:25:01
【问题描述】:

我的查询不起作用:(

这是我的疑问:

SELECT * 
FROM PESAN 
GROUP BY ID_PENGIRIM 
ORDER BY TANGGAL_PESAN

SELECT ... min(date) 
FROM ... 
GROUP BY ... 
ORDER BY min(...)

那么,什么查询适合我的需要..

提前致谢

【问题讨论】:

  • 你能解释一下你想要达到的目标吗?

标签: php mysql sql mysqli


【解决方案1】:

您的预期输出意味着您想要每个 ID_PENGIRIM 组的最新 TANGGAL_PESAN 记录。如果是这样,那么以下查询应该可以工作:

SELECT p1.*
FROM PESAN p1
INNER JOIN
(
    SELECT ID_PENGIRIM, MAX(TANGGAL_PESAN) AS max_time
    FROM PESAN
    GROUP BY ID_PENGIRIM
) p2
    ON p1.ID_PENGIRIM = p2.ID_PENGIRIM AND
       p1.TANGGAL_PESAN = t2.max_time;

子查询查找每个组的最新TANGGAL_PESAN 时间戳。然后,我们将PESAN 表加入到这个子查询中,只保留我们想要的最新记录。至于为什么您的尝试不起作用,您需要使用某种子查询来获得您想要的结果。

【讨论】:

    【解决方案2】:

    您可以按ID_PENGIRIM 进行分区,按TANGGAL_PESAN 对分区进行排序,给出排名并过滤排名为1 的结果

    select * from (
      select 
      p.*,
      row_number() over (partition by  id_pengirim order by tanggal_pesan desc nulls last) as rank 
      from pesan p
    ) where rank = 1
    

    结果

    | ID_PESAN | ID_ANGGOTA | ID_PENGIRIM | ISI_PESAN |         TANGGAL_PESAN | RANK |
    |----------|------------|-------------|-----------|-----------------------|------|
    |        1 |          1 |           1 |         a | 2017-12-29 07:32:52.0 |    1 |
    |        4 |          1 |           2 |         d | 2017-12-28 07:32:52.0 |    1 |
    

    ddl

    create table PESAN (
      id_pesan varchar2(15),
      id_anggota varchar2(15),
      id_pengirim varchar2(15),
      isi_pesan varchar2(15),
      tanggal_pesan timestamp
    );
    

    dml

    insert into PESAN values ('1','1','1','a',sysdate-1);
    insert into PESAN values ('2','1','2','b',sysdate-4);
    insert into PESAN values ('3','1','1','c',sysdate-3);
    insert into PESAN values ('4','1','2','d',sysdate-2);
    

    【讨论】:

    • MySQL 不支持ROW_NUMBER,至少不支持版本5.x。但是这个查询可能会在其他一些数据库上运行。
    • @TimBiegeleisen 是的,我没有看到 mysql 标签,这是 Oracle 特有的
    • 那是 Postgres。