【问题标题】:How to do an intersect of two subqueries using mysql如何使用mysql做两个子查询的交集
【发布时间】:2013-11-26 01:16:24
【问题描述】:

我目前正在尝试使用 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, 11。然后使用这两组的交集我们可以确定线程 3 和 7 是用户所属的线程,而不是用户所属的线程发帖的用户。

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

提前致谢, 本

【问题讨论】:

    标签: mysql messaging private-messaging


    【解决方案1】:

    在这种特殊情况下,您可以像这样使用一个带有 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
    

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

    【讨论】:

    • 感谢您的回复!
    【解决方案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-

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

    【讨论】:

    • 非常感谢,这很好用。我确实认为它可以在不使用 2 个带有相交的子查询的情况下完成,但我仍然认为提出这样的查询并不直观。你介意向我解释这个查询,以便我可以将这些知识应用到未来的案例中。再次感谢。
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2023-03-06
    相关资源
    最近更新 更多