mysql avg函数没有返回所有记录

时间:2018-04-02 21:17:11

标签: mysql sql

我正在使用以下查询

select 
    *, 
    dealer.id As dealerID, 
    services.id as serviceID 
from services 
LEFT JOIN dealer 
    on services.dealer=dealer.id 
LEFT JOIN reviews 
    ON reviews.dealer_id=dealer.id 
where services.brand_id = '9' and 
    services.model_id='107' and 
    services.petrol > 0 
ORDER BY services.total asc , 
AVG(reviews.rating) desc 

我有6条记录,它应该显示6条记录而不是只显示1.当我删除AVG(reviews.rating)desc。它显示所有记录。

mysql表是

服务

  1. 经销商
  2. brand_id
  3. MODEL_ID
  4. 汽油
  5. ID
  6. 经销商

    1. id
    2. 名称
    3. 评论

      1. ID
      2. dealer_id
      3. 等级
      4. 我不确定我在哪里做错了。如果有人可以提供帮助。

3 个答案:

答案 0 :(得分:1)

avg()聚合函数。也就是说,它从多行获取数据并对其进行汇总。

如果没有group by,则查询是对所有数据的聚合查询。这样的查询总是只返回一行。

当您使用select *,使用聚合函数且没有group by时,大多数数据库都会返回错误。 MySQL有一个(mis)功能,允许这种语法(尽管在最新版本中,默认设置不允许这样做。)

我不确定你要做什么,但avg()在这种情况下没有意义。也许这就是你想要的:

ORDER BY services.total asc, reviews.rating desc 

答案 1 :(得分:1)

如上所述,AVG()是汇总的ftn,因此我更改了desc的{​​{1}}以包含以选择平均值。

供将来参考:

提供原始数据片段也有帮助。创建sql fiddle有助于实现更多目标

order by

答案 2 :(得分:0)

您可以尝试:

SELECT 
    *, 
    AVG(c.rating) AS `avg__rating`,
    b.id AS dealerID, 
    a.id AS serviceID 
FROM services a
LEFT JOIN dealer b
    on a.dealer = b.id 
LEFT JOIN reviews c
    ON c.dealer_id = b.id 
WHERE a.brand_id = '9' and 
    a.model_id='107' and 
    a.petrol > 0 
GROUP BY a.dealer, a.brand_id, a.model_id, a.petrol, a.id, a.total
ORDER BY a.total asc, 
AVG(c.rating) desc

这会在服务表的列中添加GROUP BY,这样每个服务/经销商就会获得一行。