我正在创建一个小型投票应用程序。我需要从一张表中获取图像及其投票计数,然后检查另一张投票表,看看用户是否已经为这些图像投票。
要从图像表中获取图像,我这样做:
SELECT id, file_name, total_votes
FROM _images
WHERE approved = 1
ORDER BY total_votes DESC
LIMIT ".($page*5).", 5"
但我还需要在“投票”表中检查他们的用户标识尚未与此查询中的(图像)标识关联。我只需要一次显示5个图像,因此LIMIT应用于第一个查询。
我不确定是否需要进行一些加入或多次查询。
我的投票表有字段:
编辑: 感谢您的所有反馈。 更多信息:
当我把它放在那里时,total_votes感觉很脏,但我无法找到更好的方法来计算每次的票数。如果每次投票,或者要求查看排行榜,所有选票都必须统计和排序,这不是效率低下吗? 请原谅我的罪 - 我不是数据库程序员!答案 0 :(得分:3)
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