首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mysql进行两个子查询的交叉操作

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

Stack Overflow用户
提问于 2013-11-13 12:25:07
回答 2查看 659关注 0票数 0

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

代码语言:javascript
复制
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

然后,我可以找到一个线程列表,除了主用户之外,其他用户可以使用以下方法发布:

代码语言:javascript
复制
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查询本身内完成这个交集吗?

谢谢你,本

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-13 12:36:26

只需尝试以下查询:

代码语言:javascript
复制
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

内连接给您两个表之间的交集,它基于条件"thread_user.thread_id = threads.id"

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

我所做的只是简单地获得消息之间的交集,而table_1 -which是线程和线程_user之间的交集。

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

票数 2
EN

Stack Overflow用户

发布于 2013-11-13 12:34:39

在这种特殊情况下,您只需使用一个带有2个内部联接的查询,如下所示:

代码语言:javascript
复制
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

因此,内部连接将“某种”地为您做交叉点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19953760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档