2013-02-04 126 views
0

我有一個books,users和一個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 

問題: 作爲左連接分裂的書籍結果行,它不會給人以這兩個用戶的行...

+2

舊書如何能'BookUser.user_id'是3和18? – Andrew

+0

@Andrew這只是他希望如何工作的一個例子。我相信他正在尋找一本'Book',它正好具有2個'BookUser's,'user_id's爲'3'和'18'。 –

回答

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 
+0

我不明白左連接和不同的需要嗎? –

+0

@NitinMidha'LEFT JOIN'是有爭議的,但是'DISTINCT'使它每個書只返回一行而不是兩個。 –

+0

爲什麼會是兩個?只有一排書連接到這兩個BookUsers ... –

1
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 
0

我不知道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 
+0

您的查詢將返回不正確的結果。例如:一本書是'user_id's'3'和'5'。它有'3 OR 18'和用戶數'2'。 –

+0

@ G-Nugget,我被一個具有兩個值的變量搞糊塗了。但重新閱讀問題和意見。更新了答案。 – Sunny