mariadb 表中两列不同值的统一列表[已关闭]

cmssoen2  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(124)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
3天前关闭。
Improve this question
我有一个名为chat_messages的mariadb表。它包含用户发送的消息列表。该表包含2列,其中包含发件人id和收件人id。我想生成一个与某个人通信的唯一用户列表。我尝试了很多查询和连接,但没有一个有效。
如果我使用SELECT sender_id, receiver_id FROM chat_message WHERE sender_id=1 OR receiver_id=1 GROUP BY sender_id, receiver_id,那么我会得到一个双重列表(用户在列表中出现不止一次,即作为接收者和发送者)。我需要一个唯一的用户组合列表。
我可以使用什么sql查询来获取某个人一直在与之通信的唯一用户列表?

qacovj5a

qacovj5a1#

UNION DISTINCT与列别名一起使用

SELECT receiver_id AS ContactedPerson
FROM chat_message 
WHERE sender_id = 1
UNION DISTINCT 
SELECT sender_id  AS ContactedPerson
FROM chat_message 
WHERE receiver_id = 1
b1uwtaje

b1uwtaje2#

如果用户=1(发送者)发送消息给用户=19(接收者),用户=19(发送者)回复用户=1(接收者),您将有两个记录,不能使用GROUP BY过滤,因为两个用户都是发送者和接收者。

Records
1 | 19 | Hello
19|  1 | Hi! What's up

由于您只想知道哪些用户在一起交谈,而不想知道谁是消息的发送者或接收者,因此只需将数字较小的用户ID移到左侧,将数字较大的用户ID移到右侧:

SELECT if(sender_id < receiver_id, sender_id, receiver_id) as person1, 
       if (sender_id < receiver_id, receiver_id, sender_id) as person2
  FROM chat_message WHERE sender_id=1 OR receiver_id=1 
  GROUP BY person1, person2

当然,您也可以使用UNION,其中第一个选择将发送方放在左侧,第二个选择将接收方放在左侧:

SELECT sender_id, receiver from chat_message where sender_id=1
union select receiver_id, sender_id from  hat_message where receiver=1

根据EXPLAIN,后一个会更慢。

相关问题