我需要帮助显示当前用户尚未投票的随机结果。
目前我的数据库设置和我尝试过的最后一个查询可以在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或任何其他尚未投票的项目。
非常感谢您的帮助,建议和知识。
答案 0 :(得分: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