按最后一次出现分组
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;
我正在尝试获取 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;