2013-11-19 3 views
0

У меня есть таблица с именем messages, который хранит пользовательские сообщения, и структура таблицы выглядит следующим образом:групповые сообщения - MySQL

Сообщения:

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

Если (1,2) и (2,1) ветер в той же самой группе? –

ответ

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 демо

0

Я думаю, что вы ищете DISTINCT

SELECT DISTINCT from_id, to_id 
FROM messages 
WHERE to_id=2 
0

Я пришел со следующим раствором. Мы LEFT присоединяемся к сообщениям с ответами. Затем мы выбираем отдельные пары from_id и to_id, но мы используем выражение CASE, чтобы решить, возьмем ли мы from_id и to_id из первого сообщения или ответ. Это основано на предположении, что всегда хорошо иметь меньший 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) 
; 
FROM_ID TO_ID 
1   2 
2   4 
15   2

Check at SQLFiddle

Смежные вопросы