我正在创建一个小型投票应用程序。我需要从一个表中获得图像及其投票计数,然后检查另一个投票表,看看用户是否已经为这些图像中的每一个投票。
为了从图像表中获取图像,我正在这样做:
SELECT id, file_name, total_votes
FROM _images
WHERE approved = 1
ORDER BY total_votes DESC
LIMIT ".($page*5).", 5"
但我还需要在"投票"表中检查他们的userid是否已经与该查询中的(图像)id相关联。我一次只需要显示5个图像,因此LIMIT应用于第一个查询。
我不确定我是否需要进行一些联接或多个查询。
我的投票表有字段:
- id
- 投票人id
- image_id
编辑:感谢您的反馈。更多信息:
当我把total_votes放在那里的时候感觉很脏,但我想不出更好的方法来计算每次的选票。如果每次有人投票,或者要求查看排行榜,都必须对所有选票进行统计和排序,这不是效率低下吗?原谅我的罪过——我不是数据库程序员!
使用LEFT JOIN/IS NULL:
SELECT i.id, i.file_name, i.total_votes
FROM _images i
LEFT JOIN VOTES v ON v.image_id = i.id
AND v.voter_id = ?
WHERE approved = 1
ORDER BY total_votes DESC
LIMIT ".($page*5).", 5"
使用NOT EXISTS
SELECT i.id, i.file_name, i.total_votes
FROM _images i
WHERE approved = 1
AND NOT EXISTS (SELECT NULL
FROM VOTES v
WHERE v.image_id = i.id
AND v.voter_id = ?)
ORDER BY total_votes DESC
LIMIT ".($page*5).", 5
使用NOT IN
SELECT i.id, i.file_name, i.total_votes
FROM _images i
WHERE approved = 1
AND i.id NOT IN (SELECT v.image_id
FROM VOTES v
WHERE v.voter_id = ?)
ORDER BY total_votes DESC
LIMIT ".($page*5).", 5
建议阅读:
- http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/
- http://explainextended.com/2010/05/27/left-join-is-null-vs-not-in-vs-not-exists-nullable-columns/