7

我需要帮助来显示一个当前用户尚未投票的随机结果。

目前我的数据库设置和我尝试过的最后一个查询可以在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 或任何其他尚未投票的项目。

非常感谢您的帮助、建议和知识。

4

1 回答 1

2

要获取不存在的项目,您需要一个LEFT JOINwith 条件,否则会进行正匹配,然后添加一个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
于 2012-07-16T08:33:24.120 回答