PHP / MySQL如何从一个表中获取值并检查另一个表

时间:2011-06-09 02:31:24

标签: php mysql mysqli

我正在创建一个小型投票应用程序。我需要从一张表中获取图像及其投票计数,然后检查另一张投票表,看看用户是否已经为这些图像投票。

要从图像表中获取图像,我这样做:

  SELECT id, file_name, total_votes 
    FROM _images 
   WHERE approved = 1 
ORDER BY total_votes DESC 
   LIMIT ".($page*5).", 5"

但我还需要在“投票”表中检查他们的用户标识尚未与此查询中的(图像)标识关联。我只需要一次显示5个图像,因此LIMIT应用于第一个查询。

我不确定是否需要进行一些加入或多次查询。

我的投票表有字段:

  • ID
  • voter_id
  • image_id

编辑: 感谢您的所有反馈。 更多信息:

当我把它放在那里时,total_votes感觉很脏,但我无法找到更好的方法来计算每次的票数。如果每次投票,或者要求查看排行榜,所有选票都必须统计和排序,这不是效率低下吗? 请原谅我的罪 - 我不是数据库程序员!

1 个答案:

答案 0 :(得分:3)

使用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

建议阅读: