我有表“ chat”,其中包含sender_id,receiver_id和message列:
sender_id | recipient_id | message
-------------------------------------
1 | 2 | Test 1
2 | 1 | test test
1 | 3 | more tests
1 | 2 | aaaa
我想将结果按(sender_id,receiver_id)和相反的结果分组(recipient_id,sender_id)。结果应如下所示:
sender_id | recipient_id
------------------------
1 | 2
1 | 3
这是因为发件人也可以在另一行中成为收件人,并且我不希望获得
之类的结果sender_id | recipient_id
------------------------
1 | 2
2 | 1
这是可以正常运行,但几乎没有缺陷的SQL:
SELECT DISTINCT ON sender_id+recipient_id, sender_id, recipient_id
FROM chat
WHERE (sender_id = 10 AND recipient_id = 10);
缺陷:1.我无法在代码中使用DISTINCT ON。 2.它将分组为一行(我不确定是否真的会发生):
sender_id | recipient_id
------------------------
10 | 5
9 | 6
我不知道如何解决这个问题。任何帮助表示赞赏。
答案 0 :(得分:2)
您可以使用least()
和greatest()
首先获得较低的ID,最后获得较高的ID(或者,反之亦然)。
使用DISTINCT
:
SELECT DISTINCT
least(sender_id, recipient_id) least_id,
greatest(sender_id, recipient_id) greatest_id
FROM chat;
或者使用GROUP BY
,如果您实际上想要聚合某些内容(无论是什么max(message)
?):
SELECT least(sender_id, recipient_id) least_id,
greatest(sender_id, recipient_id) greatest_id,
...
FROM chat
GROUP BY least(sender_id, recipient_id),
greatest(sender_id, recipient_id);