我有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是與用戶
This Works。謝謝。是否有任何理由爲什麼MySQL會從OUTER JOIN中刪除'LEFT'時發生錯誤?只是有外部連接不起作用? – Chris
它不起作用,但是左連接就足夠了(你可能有一個右外連接,所以我認爲OUTER JOIN本身還不夠清晰):參見http://dev.mysql.com/doc/refman/5.0/ fr/join.html –
好的。問題是,雖然上面的腳本完全符合我需要,但大約需要18秒才能執行。讀表中有40K行。這聽起來很正常嗎?或者你認爲服務器升級會訣竅(目前在共享服務器上)? – Chris