MYSQL:查找某些用户之间的所有帖子

标签 mysql sql

我有两个表:

表消息(保存消息的创建者和消息)
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


http://sqlfiddle.com/#!2/963c0/1

最佳答案

我想这可能会做你想做的事:

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;

sqlfiddle demo

关于MYSQL:查找某些用户之间的所有帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082634/

相关文章:

sql - 如何从 SQL Server DateTime 数据类型中仅返回年份和月份

mysql - 查询无自增字段的表中新插入的记录

mysql - 编写快速 MySQL INSERT 查询或优化该查询

mysql - 使用 WHERE NOT EXISTS 进行 SQL 查询时出错

php - 向多个表中插入数据 PHP MySQL

sql - 将 5 gig 文件导入表时出错

mysql - 创建一个显示两个具有特定值的列表的 View

mysql - 在 MySQL 中使用 IF 语句并使用语句的结果进一步计算

mysql - 如何编写这个简单的 MySQL JOIN 查询?

php - 根据另一个 SQL PHP 的结果从一个表中获取数据