2013-02-02 199 views
0

我有2個表在我的數據庫(實際上更多,但他們目前沒有擔憂)。複雜的MySQL加入/ where子句

一張桌子存儲狀態爲「發佈」或「垃圾」的圖書。根據這本書是否被繼續使用,書籍具有發佈或垃圾的狀態。

另一張表存儲有關特定用戶是否已閱讀特定書籍的數據。

我想顯示用戶已閱讀並尚未閱讀的所有書籍的列表,這些書籍仍在執行。我創建了一個查詢,它將連接兩個表並匹配每本書,而不管狀態如何,特定用戶和讀取日期,如果未讀,則爲NULL。問題是,雖然我想顯示用戶尚未閱讀的圖書,但我不想顯示用戶沒有閱讀過的書籍,因爲這些書籍不再被攜帶(具有垃圾的狀態)。

目前,我一直無法做到這一點。在PHP的foreach循環中,我正在檢查是否閱讀了垃圾狀態的書,如果沒有,跳過它。這在我感覺數據庫方面是低效的。

下面是我目前使用的腳本。我正試圖完成什麼?它會或多或少地有效率?謝謝您的幫助。

SELECT 
    book.ID as actual_book_id, 
    book.post_title, 
    book.post_status, 
    read.* 
FROM books as book 
LEFT OUTER JOIN book_club as read 
    ON read.book_id = book.ID 
    AND read.user_id = $userID 
WHERE book.post_type = 'book' 
    AND book.post_status IN ('publish','trash') 
ORDER BY 
    book.post_title ASC 

假設$用戶ID是與用戶

回答

1

,而不是隻是你的一個有效的整數,你必須添加一個更復雜一點的條款。

SELECT 
    book.ID as actual_book_id, 
    book.post_title, 
    book.post_status, 
    read.* 
FROM books as book 
LEFT OUTER JOIN book_club as read 
    ON read.book_id = book.ID 
    AND read.user_id = $userID 
WHERE book.post_type = 'book' 
    AND (book.post_status = 'publish' OR 
      (book.post_status = 'trash' AND read.<columnDate> IS NOT NULL)) 
ORDER BY 
    book.post_title ASC 
+0

This Works。謝謝。是否有任何理由爲什麼MySQL會從OUTER JOIN中刪除'LEFT'時發生錯誤?只是有外部連接不起作用? – Chris

+0

它不起作用,但是左連接就足夠了(你可能有一個右外連接,所以我認爲OUTER JOIN本身還不夠清晰):參見http://dev.mysql.com/doc/refman/5.0/ fr/join.html –

+0

好的。問題是,雖然上面的腳本完全符合我需要,但大約需要18秒才能執行。讀表中有40K行。這聽起來很正常嗎?或者你認爲服務器升級會訣竅(目前在共享服務器上)? – Chris

0

我認爲你可以嘗試找到之前的user_id和找到書後。 這裏的例子:

SELECT 
    book.id as actual_book_id, 
    book.post_title, 
    book.post_status, 
    r.* 
FROM 
(
     SELECT 
      user_read.* 
     FROM book_club AS user_read 
     WHERE user_read.user_id = $userID 
) AS r 
LEFT JOIN books as book ON r.book_id = book.id 
WHERE book.post_type = 'book' 
    AND book.post_status IN ('publish','trash') 
ORDER BY 
    book.post_title ASC 

通過這種方式,你應該只顯示與post_status書=「發佈」或「垃圾」爲給定的用戶ID。