0

我目前正在尝试使用 mysql 实现消息传递系统。到目前为止,我的架构由以下表组成:threads、thread_user、messages、message_read,详见线程消息系统数据库架构设计。我需要用户所属的线程数,但不仅仅是已发布的用户。我可以首先通过查询找到用户所属的线程列表:

SELECT threads.id
FROM threads INNER JOIN thread_user ON thread_user.thread_id = threads.id
WHERE thread_user.user_id = 1
AND threads.draft = false

然后,我可以使用以下方法找到主用户以外的用户发布的线程列表:

SELECT threads.id
FROM threads INNER JOIN messages ON messages.thread_id = threads.id
WHERE messages.user_id != 1

线程必须至少有一条消息,因此通过找到这两个子查询之间的交集,我可以找到用户所属的线程列表,而不仅仅是发布的用户。

例如,第一个查询显示用户所属的线程返回 3、7、10、12,第二个查询显示除主用户之外的用户已发布的线程列表以返回 1, 2, 3, 4, 5, 6, 7, 8, 9, 11。然后使用这两组的交集我们可以确定线程 3 和 7 是用户所属的线程,并且不仅仅是用户已发布到线程。

有没有办法在 mysql 查询本身中做这个交集?

在此先感谢,本

4

2 回答 2

2

试试这个查询:

SELECT threads.id
FROM threads 
INNER JOIN thread_user ON thread_user.thread_id = threads.id
INNER JOIN messages ON messages.thread_id = threads.id
WHERE thread_user.user_id = 1
AND threads.draft = false
AND messages.user_id != 1

INNER JOIN 为您提供基于“打开”您的条件“thread_user.thread_id = threads.id”的两个表之间的交集

你的第一个查询给你线程之间的交集,thread_user -> 作为table_1,你的第二个给你线程和消息之间的交集 -> 作为table_2

我所做的只是获取消息之间的交集,以及 table_1 - 这是线程之间的交集,以及 thread_user-

我从这两个查询中收集您的条件,并将其添加到新查询中。

于 2013-11-13T12:36:26.797 回答
0

在这种特殊情况下,您可以只使用一个带有 2 INNER JOIN 的查询,如下所示:

SELECT 
  threads.id
FROM threads 
INNER JOIN thread_user ON thread_user.thread_id = threads.id AND thread_user.user_id = 1
INNER JOIN messages ON messages.thread_id = threads.id AND messages.user_id != 1
WHERE threads.draft = false

因此,内部连接会“有点”为你做交集。

于 2013-11-13T12:34:39.577 回答