按最后一次出现分组

Group by last occurrence

我正在尝试获取 rec_p_id = 4 按时间戳排序的最后一行。因为我不想让所有结果都在 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

我的 table 看起来像这样:

Table 聊天

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

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

从您的预期结果看来您正在寻找

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 中会产生错误

我为你使用了 this answer and built 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;