我有两个表:
表消息(保存消息的创建者和消息)
id - creatorId - msg
和一个表message_viewers(告诉谁可以阅读消息msgId)
msgId - userId
如果我以用户 1 创建消息并将其发送给用户 2 和用户 3,则表格将如下所示:
tbl_message:
1 - 1 - 'message'
tbl_message_viewers:
1 - 2
1 - 3
我想做的是获取用户 x1...xN(任意数量的用户)之间的消息,并且只获取他们之间的消息。
(例如,如果用户是 1、2 和 3,我想要创建者是 1、2 或 3 的消息,并且用户是 2,3,对于创建者 = 1、1 和 3,对于创建者 = 2 和 1、2 对于创造者 = 3)
我对 1 和 2、或 2 和 3、或 1 和 3 之间的消息不感兴趣,而只对 3 人之间的消息感兴趣。
我尝试了不同的方法,例如根据消息 ID 连接两个表,选择 creatorId IN (X,Y) 中的消息,然后仅采用 userId IN (X, Y) 中的行。也许是关于对行进行分组和计数,但我想不出一种可行的方法。
编辑:SQL Fiddle here
最佳答案
我想这可能会做你想做的事:
SELECT m.*
FROM message m
INNER JOIN message_viewers mv ON m.id = mv.msgId
WHERE m.creatorId IN (1, 2, 3)
AND mv.userId IN (1, 2, 3)
AND NOT EXISTS (
SELECT 1
FROM message_viewers mv2
WHERE mv2.msgId = mv.msgId
AND mv2.userId NOT IN (1, 2, 3)
)
AND mv.userId != m.creatorId;
IN 会给创建/可以看到的用户,mv.userId != m.creatorId
用于从 message_viewers 表中排除创建者(就像您在要求中显示的那样)。
编辑:
根据只在这 3 个 id 之间发送消息的要求,我想出了以下方法:
SELECT m.id,m.creatorId,m.message
FROM message m
INNER JOIN message_viewers mv ON m.id = mv.msgId
WHERE m.creatorId IN (1, 2, 3)
AND mv.userId IN (1, 2, 3)
AND mv.userId != m.creatorId
AND NOT EXISTS (
SELECT 1
FROM message_viewers mv2
WHERE mv2.msgId = mv.msgId
AND mv2.userId NOT IN (1, 2, 3)
)
GROUP BY 1,2,3
HAVING COUNT(*) = 2;
关于MYSQL:查找某些用户之间的所有帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082634/