多列上的"对称"GROUP BY

Ale*_*dro 1 sql group-by symmetric

我有一张这样的桌子:

_id sender_id receiver_id text
1   1         2           xxx
2   2         1           yyy
3   1         2           xyz
4   3         1           abc
Run Code Online (Sandbox Code Playgroud)

我需要对sender_idreceiver_id列进行GROUP BY ,但它应该是对称的,因此{1,2}和{2,1}应该被视为同一个组.

此查询可以在随机DBMS上执行,因此它应尽可能最标准.

Tim*_*sen 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,
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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)
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

  • `least`和`great`不是ANSI SQL,实际上也没有广泛支持.对于亚历山德罗来说,`case`是更好的选择. (2认同)