php - 计算单个查询中另一个表的行数

标签 php mysql sql

我目前有以下查询从表 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 循环中,但这样做效率很低,因为它在循环的每次迭代中执行多个查询。

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

最佳答案

试试这个查询

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

关于php - 计算单个查询中另一个表的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35250333/

相关文章:

php - 如果项目有许多(动态)属性,则多个左连接

sql - 修复 XML 解析的技术 : illegal qualified name character

java - PHP 上的 Java 应用程序模拟

php - 如何在网页上使用 php 和 mysql 显示印地语/马拉地语文本

php - 向表格添加滚动条并限制最多 10 个结果

java - 如何设置 Hibernate 配置属性以使用 Fabric 驱动程序连接到 Mysql

php - 将表列中的 DEC 值转换为十六进制

python - SQL ORDER BY 时间戳,相同的值

MYSQL 查询 DateTime,查找现有预订

php - Symfony 3 JMS 支付 Paypal 错误