【问题标题】:Count number of rows from another table in single query在单个查询中计算另一个表中的行数
【发布时间】:2016-02-07 15:23:38
【问题描述】:

我目前有以下查询来从表 posts 中获取帖子。

$stmt = $db->prepare(
"SELECT p_id,p_title,p_date,p_userid,p_world,p_views,p_thumb,p_link,u_username
FROM posts
INNER JOIN users
ON u_id = p_userid
ORDER BY p_hotness DESC
LIMIT 50");
$stmt->execute();
$stmt->bind_result($p_id,$p_title,$p_date,$p_userid,$p_world,$p_views,$p_thumb,$p_link,$u_username);
while($stmt->fetch()){
  $posts[] = [
    'p_id' => $p_id,
    'p_title' => $p_title,
    'p_date' => $p_date,
    'p_userid' => $p_userid,
    'p_world' => $p_world,
    'p_views' => $p_views,
    'p_thumb' => $p_thumb,
    'p_link' => $p_link,
    'u_username' => $u_username
  ];
};
$stmt->close();

但是,我还想从另一个表 post_votes 中获取帖子的赞成和反对数,该表具有以下列:

pv_id | pv_ip | pv_type | pv_postid | pv_userid

pv_type 是 0(反对)或 1(赞成)。

SELECT COUNT(*) FROM post_votes WHERE pv_postid = ? AND pv_type = 1 // upvotes
SELECT COUNT(*) FROM post_votes WHERE pv_postid = ? AND pv_type = 0 // downvotes

目前,我可以将此 SQL 放在显示每个帖子的 foreach 循环中,但这效率低下,因为它在循环的每次迭代中执行多个查询。

有什么方法可以计算上面第一个查询中帖子的赞成票和反对票数吗?

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    试试这个查询

    SELECT p_id,p_title,p_date,p_userid,p_world,p_views,p_thumb,p_link,u_username,
    sum(IF( pv.pv_type=  '1', 1 ,  0 ))  as upvote, sum(IF( pv.pv_type=  '0', 1 ,  0 ))  as downvote
    FROM posts INNER JOIN users ON u_id = p_userid 
    JOIN post_votes pv ON pv.pv_postid = posts.p_id 
    ORDER BY p_hotness DESC
    LIMIT 50
    

    并尝试此查询以进行无投票和有投票

    SELECT p_id,p_title,p_date,p_userid,p_world,p_views,p_thumb,p_link,u_username,
    (select sum(IF( pv.pv_type=  '1', 1 ,  0 )) from post_votes pv where pv_postid=posts.p_id ) as upvote,(select sum(IF( pv.pv_type=  '0', 1 ,  0 )) from post_votes pv where pv_postid=posts.p_id ) as downvote 
    FROM posts INNER JOIN users ON u_id = p_userid  ORDER BY p_hotness DESC LIMIT 50
    

    【讨论】:

    • 谢谢,除了你在 0 之前和 LIMIT 50 之后有一个 `,这给了我一个错误 - 删除那些有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2015-06-04
    • 2018-01-19
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多