如何使用mysql进行两个子查询的交叉

时间:2013-11-13 12:25:08

标签: mysql messaging private-messaging

我目前正在尝试使用mysql实现消息传递系统。到目前为止,我的模式由表格组成:threads,thread_user,messages,message_read,详见thread messaging system database schema design。我需要用户所属的线程数,但不仅仅是已发布的用户。 我首先可以找到用户所属的查询的线程列表:

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,1。然后使用两组的交集,我们可以确定线程3和7是用户所属的线程,而不仅仅是线程已发布到该主题的用户。

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

提前致谢, 本

2 个答案:

答案 0 :(得分: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为您提供基于'ON'条件的两个表格的交集“thread_user.thread_id = threads.id”

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

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

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

答案 1 :(得分: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

因此,内部联接将“有点”为你做交叉。