我有一个名为messages
的表来存储用户消息,表结构如下所示:
消息:
id from_id to_id content
1 1 2 ABC
2 2 1 BCC
3 1 2 EFG
1 4 2 GHJ
2 2 4 MNX
3 15 2 LKH
是否可以运行查询以对如下消息进行分组?
预期产出:
from_id to_id
1 2
4 2
15 2
双方之间的对话将集中在一个小组中。因此,我们可以从表messages
中看到,有3个组。
答案 0 :(得分:2)
你可以做任何一次
SELECT DISTINCT LEAST(from_id, to_id) from_id,
GREATEST(from_id, to_id) to_id
FROM messages;
输出:
| FROM_ID | TO_ID | |---------|-------| | 1 | 2 | | 2 | 4 | | 2 | 15 |
或
SELECT from_id, to_id
FROM messages
GROUP BY LEAST(from_id, to_id),
GREATEST(from_id, to_id);
输出:
| FROM_ID | TO_ID | |---------|-------| | 1 | 2 | | 4 | 2 | | 15 | 2 |
这是 SQLFiddle 演示
答案 1 :(得分:0)
我认为你正在寻找DISTINCT
SELECT DISTINCT from_id, to_id
FROM messages
WHERE to_id=2
答案 2 :(得分:0)
我已经提供以下解决方案。我们LEFT
加入带有回复的邮件。然后,我们选择不同的from_id
和to_id
对,但我们使用CASE
表达式决定我们是否会从第一个from_id
和to_id
消息或回复。这是基于这样一种假设,即from_id
中to_id
和CREATE TABLE messages (
id INT,
from_id INT,
to_id INT,
content VARCHAR(20)
);
INSERT INTO messages VALUES (1, 1, 2, 'ABC');
INSERT INTO messages VALUES (2, 2, 1, 'BCC');
INSERT INTO messages VALUES (3, 1, 2, 'EFG');
INSERT INTO messages VALUES (1, 4, 2, 'GHJ');
INSERT INTO messages VALUES (2, 2, 4, 'MNX');
INSERT INTO messages VALUES (3, 15, 2, 'LKH');
SELECT
DISTINCT
CASE
WHEN m2.from_id IS NULL
OR m1.from_id < m2.from_id THEN m1.from_id
ELSE m2.from_id
END AS from_id,
CASE
WHEN m2.to_id IS NULL
OR m1.to_id > m2.to_id THEN m1.to_id
ELSE m2.to_id
END AS to_id
FROM
messages m1
LEFT JOIN messages m2 ON (m1.from_id = m2.to_id AND m1.to_id = m2.from_id)
;
的ID较小。
解决方案:
{{1}}
FROM_ID TO_ID 1 2 2 4 15 2