2012-07-16 51 views
7

我需要幫助顯示當前用戶尚未投票的一個隨機結果。MySQL:顯示用戶未投票的一個隨機結果

目前我的數據庫設置,我已經試過可以http://sqlfiddle.com/#!2/2f91b/1

發現基本上我可以使用此查詢隔離各個項目的最後一個查詢:

SELECT a.img_url, a.item_id, a.user_id, a.img_status, b.item_question, c.user_name, c.user_fbid, d.voter_id, count(d.img_id) AS totalVotes 
FROM os_photos a 
LEFT JOIN os_items b ON a.item_id = b.item_id 
LEFT JOIN os_users c ON a.user_id = c.user_id 
LEFT JOIN os_votes d ON a.img_id = d.img_id 
GROUP BY a.img_id 
ORDER BY RAND() 
LIMIT 1 

我的問題是:隨着SQL知識我有,我無法孤立的結果,只顯示用戶#2沒有投票的行。我意識到問題在於當我使用group by時,它結合了voter_id,因此我無法檢查用戶#2是否有任何輸入。

實施例:

Item # | voter_id 
1  |  2 
1  |  3 
2  |  2 
3  |  1 
3  |  4 
4  |  3 
4  |  1 
5  |  1 
5  |  2 

利用上述樣本集,將得到的產品應該是項#3,#4或還沒有被表決任何其他項目。

非常感謝您的幫助,建議和知識。

回答

2

要獲得不中的項目存在你需要一個LEFT JOIN與條件,否則將做出積極的比賽,然後添加一個WHERE條規則所產生的一列到NULL

SELECT a.img_url, a.item_id, a.user_id, a.img_status, b.item_question, c.user_name,c.user_fbid, d.voter_id, count(d.img_id) AS totalVotes 
FROM os_photos a 
LEFT JOIN os_items b ON a.item_id = b.item_id 
LEFT JOIN os_users c ON a.user_id = c.user_id 
LEFT JOIN os_votes d ON a.img_id = d.img_id 
LEFT JOIN os_votes d2 ON a.img_id = d2.img_id AND d2.voter_id=2 
WHERE d2.voter_id IS NULL 
GROUP BY a.img_id 
ORDER BY RAND() 
LIMIT 1 
+1

我試着你的代碼在SQLfiddle中,它給了我一個錯誤。我還添加了一個例子,說明結果應該如何幫助。 – 2012-07-16 08:45:10

+0

@MichaelCheung修正了...... WHERE應該總是在GROUP BY之前。我貼了它錯誤的行;)對不起 – poncha 2012-07-16 08:47:12

+0

謝謝,這固定的查詢,但它仍然給我的結果,它不應該。例如,當它不應該是因爲用戶#2已經對項目#3進行投票時,它給了我項目#3的結果。 – 2012-07-16 08:57:18