我目前正在尝试使用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查询中做这个交集?
提前致谢, 本
答案 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
因此,内部联接将“有点”为你做交叉。