如何解决您如何在SQL中找到50%的评分低于3的产品
我正在尝试扩展我的SQL技能,并试图了解不同的查询以及如何解决它们。
当前,我正在寻找所有评论中超过50%的产品对产品的评分低于3。
这是我目前拥有的:
SELECT PRODUCT.P_NUM,PRODUCT.P_DES,AVG(REVIEW.RATE) AS average
FROM PRODUCT INNER JOIN REVIEW
ON PRODUCT.P_NUM = REVIEW.P_NUM
GROUP BY P_DES
HAVING (COUNT(REVIEW.RATE*0.5) > (AVG(REVIEW.RATE) < 3))
我哪里出错了吗?
解决方法
这是我要怎么做:
select *
from from PRODUCT as p
inner join
(
select P_NUM,avg(RATE)
from REVIEW
group by P_NUM
having sum(if(RATE < 3,1,0)) > count(*) * 0.5
) as r
on p.P_NUM = r.P_NUM
因此,内部查询通过将比率为外部查询只是找到产品
这样可以避免按varchar字段(p_des)分组
if
函数是对ANSI兼容case
的mysql扩展,因此可以用CASE WHEN RATE < 3 THEN 1 ELSE 0 END CASE
替换其他rdms
与“ if”相比,我更喜欢“ CASE”,我认为它是更可移植的ANSI。 CASE有两种形式,一种表示值,一种表示布尔条件,也是悬挂注释的好地方。
select *
from PRODUCT p
join (
select
P_NUM,avg(RATE) avg
from REVIEW
group by P_NUM
having sum( CASE WHEN RATE < 3 THEN 1
ELSE 0
END ) > ( count(*) * 0.5 )
) as r
on p.P_NUM = r.P_NUM
,
此条件聚合表达式:
avg(case when rate < 3 then 1.0 else 0.0 end)
返回每种产品的评论在3以下的比例。
所以这个查询:
select p_num
from review
group by p_num
having avg(case when rate < 3 then 1.0 else 0.0 end) > 0.5
返回所需的所有p_num
。
与运算符IN
配合使用,以返回每个产品的详细信息。
select p.*
from product p
where p.p_num in (
select p_num
from review
group by p_num
having avg(case when rate < 3 then 1.0 else 0.0 end) > 0.5
)
如果您还需要该产品的平均评分,则需要将product
连接到查询:
select p.*,t.avg_rating
from product p
inner join (
select p_num,avg(rate) avg_rating
from review
group by p_num
having avg(case when rate < 3 then 1.0 else 0.0 end) > 0.5
) t on t.p_num = p.p_num
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。