群组消息 - MySQL

时间:2013-11-19 10:22:19

标签: mysql sql

我有一个名为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个组。

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_idto_id对,但我们使用CASE表达式决定我们是否会从第一个from_idto_id消息或回复。这是基于这样一种假设,即from_idto_idCREATE 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

Check at SQLFiddle