【问题标题】:select down and up votes for each post php mysql为每个帖子 php mysql 选择向下和向上投票
【发布时间】:2015-03-04 12:11:51
【问题描述】:

我有一个论坛,用户可以在其中发布问题并可以支持和反对。

我想获取每个帖子的upvotedownvote

我之前所做的是在 3 组查询中执行此操作。

$data = mysqli_query($con,"select * from posts");
while($row = mysqli_fetch_assoc($data)){
  $pid  = $row['post_id'];
  $up = mysqli_fetch_assoc(mysqli_query("SELECT COUNT(*) as c FROM up WHERE post_id = $pid"))['c'];
  $down = mysqli_fetch_assoc(mysqli_query("SELECT COUNT(*) as c FROM down WHERE post_id = $pid"))['c'];
}

谁能告诉我如何在一个查询中做这些事情,因为如果在第一个查询中得到很多posts,那么会有很多查询要做。

【问题讨论】:

  • 那么优化它的第一种方法是使用任何列名而不是 *。尤其是您只需要 post_id 的第一个查询。
  • 你能展示一下你的posts表的结构吗?
  • @AntonyD'Andrea 这只是一个例子,我知道你在说什么
  • @AmitThakur 工作完成

标签: php mysql sql select count


【解决方案1】:

您可以为此使用相关子查询 并根据帖子ID计算反对票

SELECT p.*,
       ( select count(*)  from up where post_id = p.post_id ) as upVotesCount,
       ( select count(*)  from down where post_id = p.post_id ) as downVotesCount,
 FROM posts p

【讨论】:

  • 更快吗? @雷达
  • @RockFellerDumbstep,是的,如果有适当的索引,它会更快。 mysql 引擎会进行所需的优化。
  • 你可能想看看这个@radar stackoverflow.com/questions/27806127/…
【解决方案2】:

您可以使用子查询并将所有内容放在第一个查询中。

这可能是一个好的开始:

$data = mysqli_query($con, "select posts.*, " . 
                           "(SELECT COUNT(*) FROM up WHERE post_id = posts.post_id) as totalUp, " . 
                           "(SELECT COUNT(*) FROM down WHERE post_id = posts.post_id) as totalDown " .
                           "from posts");
while($row = mysqli_fetch_assoc($data)){
  // ...
}

【讨论】:

  • 更快吗? @forguesr
  • 是的:如果posts 表中有很多行,您会注意到差异。就像您指出的那样,将有一个查询而不是多个查询。事实上,由另一个查询控制的循环内的查询可能是您做错了什么的气味。
  • 现在在由 query 控制的循环中使用 query 真的很糟糕吗? @forguesR(在极端不可能的条件下?)
  • 很多时候你可以用一个查询而不是一个循环来做同样的事情,这几乎总是更快,因为数据库引擎已经过大量优化。
  • 你可能想看看这个@forguesR stackoverflow.com/questions/27806127/…
猜你喜欢
  • 2016-05-14
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多