SQL - 从其他表

时间:2017-10-23 09:39:35

标签: php sql join average

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

    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的评论点。所以如果他们有一个评论,我希望得到所有的列表,只需用mail_approved = 1计算这些评论的AVG

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

这是我的问题:

   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

2 个答案:

答案 0 :(得分: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。 Concatting容易出错,让您更容易受到SQL injection的攻击。<​​/ p>

答案 1 :(得分:0)

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

payed