我的问题听起来很简单,但我被卡住了。
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
答案 0 :(得分:1)
您使用了join
,这是inner join
的缩写。如果两个表中都存在匹配的记录,则此类型的连接仅提供结果。将其更改为left join
(left 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
作为旁注,请检查预准备语句(对于PDO或MySQLi),了解将输入参数传递给查询的正确方法,而不是与类似的变量连接$get_state
。 Concatting容易出错,让您更容易受到SQL injection的攻击。</ p>
答案 1 :(得分:0)
外部加入酒店的平均评级:
payed