在mysql中使用group by with join时未获得正确的结果

在mysql中使用group by with join时未获得正确的结果,mysql,join,group-by,Mysql,Join,Group By,我有3个表,分别命名为用户、餐厅、评论。在这里,用户的id(主键)在餐馆和评论表中充当外键uid,rate_to与餐馆的uid相关联,rate_by与users表的id相关联。我希望所有餐馆都属于餐馆表中的那个用户,但按他们的评论表中的平均价格排序。我已为此使用此查询 SELECT `Restaurant`.`id`, `Review`.`avg_rating`, `Review`.`rate_to` FROM `users` AS `User` LEFT JOIN `reviews` A

我有3个表,分别命名为用户、餐厅、评论。在这里,用户的id(主键)在餐馆和评论表中充当外键uid,rate_to与餐馆的uid相关联,rate_by与users表的id相关联。我希望所有餐馆都属于餐馆表中的那个用户,但按他们的评论表中的平均价格排序。我已为此使用此查询

 SELECT `Restaurant`.`id`, `Review`.`avg_rating`, `Review`.`rate_to`
 FROM `users` AS `User`
 LEFT JOIN `reviews` AS `Review` ON (`User`.`id` = `Review`.`rate_to`)
 LEFT JOIN `restaurants` AS `Restaurant` ON (`User`.`id` = `Restaurant`.`uid`) 
 WHERE  `User`.`type` = '0'  AND  `User`.`isdeleted` = '0'
 GROUP BY `Review`.`rate_to` ORDER BY `Review`.`avg_rating` DESC     
但当我使用它时,它只会给我那些在评论表中有条目的餐厅,但我希望所有不同于餐厅表的餐厅在评论表中按平均比率排序


请帮助。

我不确定在这种情况下,左连接是否可以工作两次。也许您应该使用子查询?

我可以看出,用户表对您的结果没有任何用处。您可以尝试以下方法:

SELECT `Resturant`.`id` , MAX( `Review`.`avg_rating` ) AS max_avg, `Review`.`rate_to` FROM `resturants` AS `Resturant` LEFT JOIN reviews AS Review ON ( `Resturant`.`uid` = `Review`.`rate_to` ) WHERE 1 GROUP BY `Resturant`.`id` ORDER BY `Review`.`avg_rating` DESC
您的选择列表中有一些(非聚合)字段,这些字段在您的分组中没有被提及


大多数数据库管理系统都禁止这样做,这是有充分理由的。MySQL没有,因此您将得到您想要的

 SELECT `Restaurant`.`id`, `Review`.`avg_rating`, `Review`.`rate_to`
 FROM `restaurants` AS `Restaurant` 
 LEFT JOIN `reviews` AS `Review` ON (`Review`.`rate_to` = `Restaurant`.`uid`) 
 LEFT JOIN `users` AS `User` ON (`User`.`id` = `Review`.`rate_by`)
 WHERE  `User`.`type` = '0'  AND  `User`.`isdeleted` = '0'
 GROUP BY `Restaurant`.`id` ORDER BY `Review`.`avg_rating` DESC   
那会确保你得到所有的餐馆。不过,它也不起作用,因为
Review.avg_rating
Review.rate_to
不是聚合函数-如果您需要聚合,我看不出
User
如何在这里发挥作用

试一试

这应该更好,但您将包括所有已删除的用户

为了摆脱被删除用户留下的评论,您可能需要一个子查询:

 SELECT `Restaurant`.`id`, AVG(`Review`.`avg_rating`)
 FROM `restaurants` AS `Restaurant` 
 LEFT JOIN (select r.* from `reviews` r
     JOIN `users` AS `User` ON (`User`.`id` = `Review`.`rate_by`)
     WHERE  `User`.`type` = '0'  AND  `User`.`isdeleted` = '0'
 ) AS `Review` ON (`Review`.`rate_to` = `Restaurant`.`uid`) 
 GROUP BY `Restaurant`.`id` 
 ORDER BY AVG(`Review`.`avg_rating`) DESC   

因为您没有向我们提供DDL,所以我没有测试其中任何一个

你的参考键令人困惑。审查(评级)参考餐厅(uid)参考用户(id)。您能提供完整的表结构吗?
rate\u to
仍然不在GROUP BY中,也不在聚合函数下。根据实际数据,这可能是问题,也可能不是问题,但我会做一个或另一个,不会让它“挂起”,以防万一。
 SELECT `Restaurant`.`id`, AVG(`Review`.`avg_rating`)
 FROM `restaurants` AS `Restaurant` 
 LEFT JOIN (select r.* from `reviews` r
     JOIN `users` AS `User` ON (`User`.`id` = `Review`.`rate_by`)
     WHERE  `User`.`type` = '0'  AND  `User`.`isdeleted` = '0'
 ) AS `Review` ON (`Review`.`rate_to` = `Restaurant`.`uid`) 
 GROUP BY `Restaurant`.`id` 
 ORDER BY AVG(`Review`.`avg_rating`) DESC