【问题标题】:How to assign zero(0) when the avg of a particular field is null in PostgreSQL当特定字段的平均值在 PostgreSQL 中为空时如何分配零(0)
【发布时间】:2015-04-06 10:35:38
【问题描述】:

我有两张桌子:

user_ratings

id  home_info_id  ratings
1   1             3.5 
2   2             3.5
3   1             4
4   1             5
5   1             2
6   2             1
7   2             4

home_info

id  home_name 
1   my_home
2   ur_home
3   his_home

如您所见,“my_home”和“ur_home”有评分,但“his_home”尚未评分。我正在计算所有房屋的平均值,所以我只得到两个房屋的平均值,即“my_home”和“ur_home”,正如我所说的“his_home”尚未评级,所以我的查询中没有得到“his_home”以下。我想要所有尚未评级的房屋名称。这是我的查询:

select u.home_info_id
     , avg(u.ratings)
     , h.home_name
from user_ratings u
   , home_info h 
where h.id = u.home_info_id
group by u.home_info_id
       , h.home_name;

输出是这样的:

home_info_id  ratings  home_name 
1             4.83     my_home     
2             2.83     ur_home

但我想要这样的东西:

 home_info_id  ratings  home_name 
 1             4.83     my_home     
 2             2.83     ur_home
 3             0        his_home

【问题讨论】:

  • 为什么是 MySQL 标签? (不要标记未涉及的产品...)
  • 查询对所有人都是一样的,如果我对 mysql 查询有所了解,我将在 postgresql 中实现
  • 现在删除了 sql 和 mysql 标签,请为我被否决的问题投票,现在它有足够的信息。:-(
  • user_reviewuser_ratings?请使问题保持​​一致。
  • 修正了 mr.@ErwinBrandstetter 顺便说一句,我并不是要公开和私人的,我认为主要目的是获得知识,没有人为我写查询,我来这里是为了从那些谁那里获取知识希望分享。感谢您发现错误。

标签: sql postgresql left-join aggregate-functions postgresql-9.1


【解决方案1】:

您可以将COALESCELEFT JOIN 一起使用(而不是隐式INNER JOIN):

select h.id
     , coalesce(avg(u.ratings), 0)
     , h.home_name
from home_info h 
left join user_review u on h.id = u.home_info_id
group by h.id
       , h.home_name

【讨论】:

  • 好吧,我正在获取 home_name 和 rating 的字段名称,但 home_info id 为空白
  • @aruna angadi:好吧,如果你使用LEFT JOIN,你将无法得到你所写的结果,因为它会留下来自home_info的所有记录(评级12和未分级的3)。
  • 所以我不会得到未评级房屋的 hall_info_id 字段??
  • @aruna angadi:好吧,只需检索home_info.id 而不是user_review.home_info_id
  • 非常感谢....我支持你,先生,请告诉我也支持我的问题,有人反对我的问题。非常感谢你
【解决方案2】:

当扫描整个表或大部分表时,在加入之前聚合会更便宜:

SELECT h.id, h.home_name
     , COALESCE(u.avg_rating, 0) AS avg_rating
FROM   home_info h
LEFT   JOIN (
   SELECT home_info_id AS id, avg(ratings) AS avg_rating
   FROM   user_review
   GROUP  BY 1
   ) u USING (id);

使用EXPLAIN ANALYZE 进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多