首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何压缩3个mysql查询;使用AVG和计数

如何压缩3个mysql查询;使用AVG和计数
EN

Stack Overflow用户
提问于 2014-03-31 21:28:53
回答 2查看 86关注 0票数 0

这些查询可以浓缩成2,甚至更好的1查询吗?

查询1

代码语言:javascript
复制
$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

代码语言:javascript
复制
$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

代码语言:javascript
复制
$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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-31 21:35:25

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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-03-31 21:40:04

查询2和查询3可以很容易地组合成一个查询:

代码语言:javascript
复制
SELECT ROUND(AVG(rating),1) as AVG_Rating
     , COUNT(*) AS count_
FROM reviews
WHERE Provider LIKE CONCAT('%',:provider,'%')

但是您将无法使用fetchColumn(),您需要获取行并访问每个列。

此查询(如查询2和查询3)返回一行。查询1有可能返回0、1或更多行,因此组合该查询会有一些问题。可以在每一行返回AVG_Ratingcount_,但是处理结果集的代码就不那么简单了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22772541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档