"Симметричный" 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} должны рассматриваться как одна и та же группа.

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

1 ответ

Решение

Я думаю тебе нужно два 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() в качестве скалярных функций:

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)
Другие вопросы по тегам