繁体   English   中英

SUM()在MySQL中不起作用:SUM()与DISTINCT

[英]SUM() not working in MySQL : SUM() with DISTINCT

我有4个表,称为商店,用户,评论和评级。

我想获得相应商店的所有评论,包括评论的用户详细信息以及该商店的整体评分。

我几乎完成了单个查询。 但问题是,如果商店对同一用户进行多次相同评级,则将其视为单一评级。 但该评级数是正确的。

在此输入图像描述

从该表中,user_id 3被评为shop_id 1为4次。 因此计数为4,total_rating为17。

我的疑问是

select review.comments, users.username, count(distinct rating.id) as rating_count,
sum(distinct rating.rating) as total_rating from users 
left join review on users.id = review.user_id and review.shop_id='1' 
left join rating on users.id = rating.user_id and rating.shop_id='1' 
where review.shop_id='1' or rating.shop_id='1' 
group by users.id, review.user_id, rating.user_id, review.id

当我运行此查询时,我得到了

在此输入图像描述

但我需要total_rating 17 for user_id 3 ..

检查这个小提琴

你把DISTINCT sum( rating.rating) as total_rating,这就是为什么结果( 12 = 17-5 ),因为它在计算总和时只包含5次。

 select review.comments, review.user_id, count(distinct rating.id) as rating_count,
    sum( rating.rating) as total_rating from users 
    left join review on users.id = review.user_id and review.shop_id='1' 
    left join rating on users.id = rating.user_id and rating.shop_id='1' 
    where review.shop_id='1' or rating.shop_id='1' 
    group by users.id, review.user_id, rating.user_id, review.id

这是SQLFiddle

样本输出: 在此输入图像描述 希望这可以帮助

试试这个 - 删除与sum(rating.rating)的区别。 由于你给了sum(distinct rating.rating) ,它忽略了用户3给商店1的5。

select review.comments, users.username, count(distinct rating.id) as rating_count,
sum(rating.rating) as total_rating from users 
left join review on users.id = review.user_id and review.shop_id='1' 
left join rating on users.id = rating.user_id and rating.shop_id='1' 
where review.shop_id='1' or rating.shop_id='1' 
group by users.id, review.user_id, rating.user_id, review.id

首先:从表中外连接记录然后在WHERE子句中删除它们是没有意义的。 使用left join review ...你说:在表评论中找到匹配的记录,如果你没有找到任何,那么添加空值,所以我们保留用户记录。 然后where review.shop_id='1'你说:只记录你实际在审查中找到记录的记录。 所以你要解雇那些你只是痛苦不堪的记录。 你的WHERE子句使你的LEFT OUTER加入仅仅INNER JOINS。

至于你的实际问题:这源于首先加入所有表,然后尝试从结果记录中获取聚合。 在加入之前汇总:

select 
  rev.comments, 
  usr.username, 
  coalesce(rat.rating_count, 0) as rating_count,
  rat.total_rating 
from review rev
join users usr on users.id = review.user_id 
left join
(
  select user_id, shop_id, count(*) as rating_count, sum(rating) as total_rating
  from rating 
  group by user_id, shop_id
) rat on rat.user_id = usr.id and rat.shop_id = rev.shop_id
where rev.shop_id = 1 
group by rev.id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM