2010-05-19 54 views
1

希望我可以問這個,而不會混淆。我是一名攝影師,我正在讓一些客戶爲我們拍攝的照片評分。我們在我們的投資組合中有數百張照片,可能會對其進行評級。我想要做的是要求我們的客戶再次評價照片,但只向他們展示他們尚未評級的照片。我目前有三個表格:一個存儲實際評分,一個存儲圖片(或每張圖片的位置),另一個存儲評估者的信息。我爲我的數據庫管理使用codeigniter,如果有幫助的話。我到目前爲止是這樣的:MySQL尋找缺失評分

"SELECT * FROM ratings LEFT JOIN portfolio ON ratings.portfolioid = portfolio.portfolioid"

這會給我一行的每個評級,但不會顯示我的圖片評級缺失的地方。提前致謝!

回答

0

我現在不能測試,但會像這樣做的工作:

SELECT * FROM portfolio LEFT JOIN (
    SELECT portfolioid FROM rating WHERE email = "[email protected]" 
) AS rated USING (portfolioid) 
WHERE rated.portfolioid IS NULL 
+0

我得到一個數據庫錯誤:未知的列'ratings.portfolioid'在'where子句'...我不知道爲什麼。我很確定我沒有錯誤地拼寫任何內容。這可能是因爲特定的查詢嗎? – Dustin 2010-05-19 16:11:08

+0

您應該有WHERE rated.portfolioid IS NULL,而不是WHERE ratings.portfolioid IS NULL - rated是由子查詢生成的臨時表的名稱。 – ChrisV 2010-05-19 16:30:57

+0

美麗!這樣做(至少我是這麼認爲的)。對不起愚蠢的錯誤:)感謝您的幫助! – Dustin 2010-05-19 16:34:33

1
SELECT * FROM portfolio WHERE NOT EXISTS (SELECT * FROM ratings where ratings.portfolioid = portfolio.portfolioid) 

SELECT * FROM portfolio LEFT JOIN ratings ON portfolio.portfolioid = ratings.portfolioid WHERE ratings.portfolioid IS NULL 

兩者都應該給你沒有評級的人。

+0

LEFT JOIN版本是更好的方法(更好的性能)。 – nathan 2010-05-19 14:54:12

+0

我也在其他答案下評論過....我相信這隻會顯示那些還沒有被評分過的圖片。我想要的是顯示未被特定人評分的照片。我還記錄了該人的電子郵件地址,但是每當我放入(和電子郵件='[email protected]')時,它都會給出一個空的結果。有任何想法嗎? – Dustin 2010-05-19 15:21:09

1

@ChrisV - 你能避免使用此版本的子查詢:

SELECT * FROM portfolio p 
LEFT OUTER JOIN rating r ON r.portfolioid = p.portfolioid AND r.email = '[email protected]' 
WHERE r.portfolioid IS NULL 

這就是外部連接的美麗與額外的條件。在加入之前應用額外的條件。它只會將投資組合加入符合額外條件的評級(AND r.email = ...),因此如果評級不存在,則意味着'[email protected]'尚未對該投資組合進行評級。

+0

好的 - 我有一種嘮叨的感覺,我錯過了一個更好的方法!這將優化以及更簡單。 – ChrisV 2010-05-20 09:44:54