【问题标题】:Group by last occurrence按最后一次出现分组
【发布时间】:2021-05-10 21:01:31
【问题描述】:

我正在尝试获取按时间戳排序的 rec_p_id = 4 的最后一行。由于我不想让所有结果 WHERE rec_p_id = 4,所以我使用 GROUP BY 按 send_p_id 对其进行分组。

我的 SQL 查询如下所示:

SELECT * 
  FROM 
     ( SELECT * 
        FROM chat 
      WHERE rec_p_id= "4" 
      ORDER 
        BY timestamp DESC) as sub 
 GROUP 
    BY send_p_id

我的桌子是这样的:

桌聊

c_id send_p_id rec_p_id timestamp
1 3 4 2020-05-01 14:46:00
2 3 4 2020-05-01 14:49:00
3 3 4 2020-05-01 14:50:00
4 7 4 2020-05-01 12:00:00
5 4 7 2020-05-01 12:10:00
6 7 4 2020-05-01 12:20:00
7 9 4 2020-05-01 16:50:00
8 9 4 2020-05-01 17:00:00

我想获取最后出现的次数:

c_id send_p_id rec_p_id timestamp
3 3 4 2020-05-01 14:50:00
6 7 4 2020-05-01 12:20:00
8 9 4 2020-05-01 17:00:00

但是我得到了所有第一个:

c_id send_p_id rec_p_id timestamp
1 3 4 2020-05-01 14:46:00
4 7 4 2020-05-01 12:00:00
7 9 4 2020-05-01 16:50:00

我看到了我在这个问题中使用的查询:ORDER BY date and time BEFORE GROUP BY name in mysql

它似乎对所有人都有效。我的查询做错了什么? 提前致谢。

【问题讨论】:

  • 不管你认为这个查询做什么,恐怕你错了。见meta.stackoverflow.com/questions/333952/…
  • @aajuu19 你有机会试试我的方法吗?
  • @Strawberry 感谢您的评论。下次我会记住这一点。

标签: mysql sql group-by mysql-5.7


【解决方案1】:

期待你的预期结果似乎你正在寻找

select max(c_id) c_id, send_p_id, min(timestamp) timestamp
from chat WHERE rec_p_id= "4" 
group by send_p_id
ORDER BY c_id

分组依据是聚合结果..
没有聚合函数的使用会产生不可预测的结果,并且在版本 > 5.6 中会产生错误

【讨论】:

  • 谢谢,这对我有用。我想我在 SQL 方面还有很多东西要学。
【解决方案2】:

我使用this 回答并为您构建了this 设置。
下面的代码是它的副本,以便您以后可以自己运行它。 对于解决方案,来自official manual 的示例。

CREATE TABLE chat
(
        c_id INT PRIMARY KEY
    ,   send_p_id INT
    ,   rec_p_id INT
    ,   timestamp DATETIME
     
);

INSERT INTO chat VALUES
    (1, 3,  4,  '2020-05-01 14:46:00')
,   (2, 3,  4,  '2020-05-01 14:49:00')
,   (3, 3,  4,  '2020-05-01 14:50:00')
,   (4, 7,  4,  '2020-05-01 12:00:00')
,   (5, 4,  7,  '2020-05-01 12:10:00')
,   (6, 7,  4,  '2020-05-01 12:20:00')
,   (7, 9,  4,  '2020-05-01 16:50:00')
,   (8, 9,  4,  '2020-05-01 17:00:00');

解决方案:

SELECT c_id,
       send_p_id,
       rec_p_id,
       timestamp
FROM   chat AS c
WHERE  timestamp=(SELECT MAX(c1.timestamp)
              FROM chat AS c1
              WHERE c.send_p_id = c1.send_p_id)
AND send_p_id != 4
ORDER BY timestamp;

【讨论】:

  • 您好 Farukh,感谢您的回答。您的解决方案对我也很有效!谢谢你和scais。我可以快速检查一下哪些查询更快?
  • 也许this可以帮到你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多