mysql - 我怎样才能压缩3个mysql查询;使用 AVG 和 COUNT

标签 mysql join pdo

这些查询是否可以压缩为 2 个,甚至更好为 1 个查询?

查询 1

$stmt = $conn->
prepare("
    SELECT providers.Provider_ID, providers.Description, reviews.Date, reviews.F_Name, reviews.S_Name, reviews.Website, reviews.Rating, reviews.Message, reviews.Email_Address
    FROM providers
    INNER JOIN reviews ON reviews.Provider=providers.Provider_ID    
    WHERE providers.Provider_ID LIKE CONCAT('%',:provider,'%') LIMIT $set_limit 
");
$stmt->bindParam(':provider', $provider, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

查询 2

$stmt = $conn->
prepare("
    SELECT ROUND(AVG(rating),1) as AVG_Rating
    FROM reviews
    WHERE Provider LIKE CONCAT('%',:provider,'%') 
");
$stmt->bindParam(':provider', $provider, PDO::PARAM_STR);
$stmt->execute();
$get_average = $stmt->fetchColumn();    

查询3

$stmt = $conn->
prepare("
    SELECT COUNT(*)
    FROM reviews
    WHERE Provider LIKE CONCAT('%',:provider,'%') 
");
$stmt->bindParam(':provider', $provider, PDO::PARAM_STR);
$stmt->execute();
$total_rows = $stmt->fetchColumn();

最佳答案

您正在汇总不同粒度级别的结果。一个是提供者级别,另一个是审核级别。因此,您需要带有摘要信息的评论。您可以通过加入聚合结果来获得此结果:

SELECT p.Provider_ID, p.Description, r.Date, r.F_Name, r.S_Name,
       r.Website, r.Rating, r.Message, r.Email_Address,
       tsum.AVG_Rating, tsum.cnt
FROM providers p INNER JOIN
     reviews r
     ON r.Provider = p.Provider_ID CROSS JOIN
     (SELECT Provider, ROUND(AVG(rating),1) as AVG_Rating, COUNT(*) as cnt
      FROM reviews
      WHERE Provider LIKE CONCAT('%',:provider,'%')
     ) tsum
WHERE p.Provider_ID LIKE CONCAT('%',:provider,'%')
LIMIT $set_limit

关于mysql - 我怎样才能压缩3个mysql查询;使用 AVG 和 COUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22772541/

相关文章:

mysql - 如何通过计算IN和OUT之差来计算物理量

xml - 如何在一个相应的列上加入两个单独的文件?

php - 使用 PDO 的 PHP 查询未插入 MySQL

mysql - 选择具有最大值的行数

mysql - 从联合手工制作的网站和 WordPress 迁移到仅 WordPress

php - mysql php选择句子before after关键字

php - Laravel 连接表

php - 如何使用 CentOS 启用 PDO?

php - 与 PDO::FETCH_CLASS 相反

MYSQL 子查询需要返回多行,父查询的每个结果 LIMIT 5