2012-07-16 108 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