2016-06-07 2 views
1

У меня есть таблица вроде этого:«Симметричный» GROUP BY по нескольким столбцам

_id sender_id receiver_id text 
1 1   2   xxx 
2 2   1   yyy 
3 1   2   xyz 
4 3   1   abc 

мне нужно сделать GROUP BY на обоих sender_id и receiver_id колонн, но оно должно быть симметричным, так {1, 2} и {2,1} следует рассматривать как одну и ту же группу.

Этот запрос может быть выполнен на случайной СУБД, поэтому он должен быть как можно более стандартным.

ответ

5

Я думаю, что вам нужно дваCASE выражения здесь, так как вы группировки на две колонки:

GROUP BY CASE WHEN sender_id < receiver_id THEN sender_id 
       ELSE receiver_id 
     END, 
     CASE WHEN sender_id < receiver_id THEN receiver_id 
       ELSE sender_id 
     END, 

Если вы используете MySQL, то рассмотрите возможность использования LEAST(), GREATEST() трюк:

SELECT LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id) 
FROM yourTable 
GROUP BY LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id) 

В SQLite вы можете использовать MAX() и MIN() как scalar functions:

SELECT MIN(sender_id, receiver_id), MAX(sender_id, receiver_id) 
FROM yourTable 
GROUP BY MIN(sender_id, receiver_id), MAX(sender_id, receiver_id) 
+0

Спасибо! Поддерживает ли Sqlite МЕНЬШЕ и БОЛЬШЕ? – Alessandro

+2

«наименьшие» и «самые большие» не являются ANSI SQL, и на самом деле они также не поддерживаются. 'case' - лучший выбор для целей Алессандро. – Luaan

+0

Двойной оператор CASE работает правильно! Большое спасибо! – Alessandro