2016-06-07 46 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_idreceiver_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