【问题标题】:Conditional filtering with left join左连接条件过滤
【发布时间】:2013-01-19 16:38:13
【问题描述】:

我有一个 booksusers 和一个 books_users 表。

现在,我想要一本由我(user_id = 3)和其他用户(user_id = 18)管理的书:

SELECT *
FROM books as Book
LEFT JOIN books_users as BookUser
    ON BookUser.book_id = Book.id
WHERE
    Book.user_count = 2 AND
    BookUser.user_id = 3 AND
    BookUser.user_id = 18

问题: 由于左连接将书籍的结果分成几行,所以它不会给两个用户一行...

【问题讨论】:

  • BookUser.user_id 怎么可能是 3 和 18?
  • @Andrew 这只是他希望它如何工作的一个例子。我相信他正在寻找一个 Book,它正好有 2 个 BookUsers 和 user_ids 的 318

标签: mysql join conditional-statements


【解决方案1】:

我相信您想加入 BookUser 表两次以获取两个条件并使用 DISTINCT 获取图书一次:

SELECT DISTINCT Book.*
FROM books as Book
LEFT JOIN books_users as BookUser1
    ON BookUser.book_id = Book.id
LEFT JOIN books_users as BookUser2
    ON BookUser.book_id = Book.id
WHERE
    Book.user_count = 2 AND
    BookUser1.user_id = 3 AND
    BookUser2.user_id = 18

【讨论】:

  • 不明白left join和distinct的必要性?
  • @NitinMidha LEFT JOIN 值得商榷,但DISTINCT 使它每本书只返回一行而不是两行。
  • 你是对的。我在想它仍然会有两行,但这是最初的问题,我们现在已经过去了。 DISTINCT 是多余的。
【解决方案2】:
SELECT *
  FROM books as B
 INNER JOIN books_users as BU1
    ON BU1.book_id = B.id
 INNER JOIN books_users as BU2
    ON BU2.book_id = B.id
 WHERE B.user_count = 2
   AND BU1.user_id = 3
   AND BU2.user_id = 18

【讨论】:

    【解决方案3】:

    我不知道 user_count 列。

    这给出了 3 或 18 使用的书籍

    SELECT *
    FROM books as Book
    INNER JOIN books_users as BookUser
        ON BookUser.book_id = Book.id
    WHERE
        Book.user_count = 2 AND
        BookUser.user_id IN  (3,18) 
    

    SELECT *
    FROM books as Book
    INNER JOIN books_users as BookUser
        ON BookUser.book_id = Book.id
    WHERE
        Book.user_count = 2 AND
        (BookUser.user_id = 3 OR BookUser.user_id = 18)
    

    编辑:这给出了 3 岁和 18 岁都使用的书籍。

    SELECT book.*
    FROM books as Book
    INNER JOIN books_users as BookUser1
        ON BookUser1.book_id = Book.id
    INNER JOIN books_users as BookUser2
        ON BookUser2.book_id = Book.id
    WHERE
        Book.user_count = 2 AND
        BookUser1.user_id = 3 AND
        BookUser2.user_id = 18
    

    【讨论】:

    • 您的查询将返回不正确的结果。示例:一本书 user_ids 35。它有3 OR 182 的用户数。
    • @G-Nugget,我对一个有两个值的变量感到困惑。但是重新阅读问题和cmets。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 2012-03-14
    • 2011-06-05
    • 1970-01-01
    • 2015-07-18
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多