【问题标题】:SQL - Get AVG value from other tableSQL - 从另一个表中获取 AVERAGE 值
【发布时间】:2017-10-23 09:39:34
【问题描述】:

我的问题听起来很简单,但我卡住了。

    Sample Data:

    Listing:

    id title                State 
    1  Hotel with nice view Arizona
    2  Hotel to stay        Arizona

    Review:

    id listing_id rating  mail_approved
    1  1          4(stars)  1
    2  1          4(stars)  0
    3  1          3(stars)  1
    4  2          5(stars)  1

所以现在我得到了列表的 AVG 值,但是当评论为 mail_approved = 1 时,我只想获得每个列表的值。但是当没有评论或没有评论时 mail_approved = 1 它应该只给我 0.0 个评论点的列表。因此,如果他们有评论,我想找回所有列表,只需计算这些评论的 AVG,mail_approved = 1

我该怎么做? 我必须重写整个查询吗?

这是我的查询:

   SELECT
     ls.id,
     title,
     state,
     ROUND(AVG(rating),2) avg_rating
   FROM listing ls
   JOIN review rv
   ON ls.id = rv.listing_id
     WHERE ls.state = '$get_state'
   GROUP BY ls.id,
      title,
      state
   ORDER BY avg_rating DESC

【问题讨论】:

  • join (=inner join) 更改为left join,我想你就在那里。
  • LEFT JOIN review rv ON ls.id = rv.listing_id AND rv.mail_approved = 1
  • 用您正在使用的数据库标记您的问题。

标签: php sql join average


【解决方案1】:

您使用了join,它是inner join 的缩写。只有在两个表中都存在匹配记录时,这种类型的连接才会给出结果。将其更改为 left joinleft outer join 的缩写),以包括没有评论的列表。

您还需要将状态检查和任何其他检查移至加入条件,否则那些未经审查的列表将再次从结果中删除。

最后,您可以通过coalesce 的平均值来获得这些记录的0 而不是null

   SELECT
     ls.id,
     title,
     state,
     COALESCE(ROUND(AVG(rating),2), 0) avg_rating
   FROM listing ls
   LEFT JOIN review rv
   ON ls.id = rv.listing_id 
     AND ls.state = '$get_state'
     AND ls.mail_approved = 1
   GROUP BY ls.id,
      title,
      state
   ORDER BY avg_rating DESC

附带说明,请检查准备好的语句(对于PDOMySQLi),了解将输入参数传递给查询的正确方法,而不是与$get_state 等变量连接。连接容易出错,并且使您更容易受到SQL injection 的攻击。

【讨论】:

    【解决方案2】:

    外部加入酒店的平均评分:

    select
      l.id,
      l.title,
      l.state,
      coalesce(r.avg_rating, 0)
    from listing l
    left join
    (
      select
        listing_id,
        round(avg(rating), 2) as avg_rating
      from review
      where mail_approved = 1
      group by listing_id
    ) r on r.listing_id = l.id
    where l.state = '$get_state'
    order by avg_rating desc;
    

    【讨论】:

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