我目前正在尝试使用 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 查询本身中做这个交集?
在此先感谢,本