2016-10-02 67 views
0

因此我被要求查询查询:查找用户评论(最有经验)前20名用户评为平均星级。与底部20个用户评定的平均分(至少expereinced)问题与AVG和LIMIT SQL

的模式是比较:

餐厅(名称)

排名(它是如何通过旅行顾问排名,它不知道它们的排名功能是什么,它不只是评分),它不仅仅是评分)

得分(评论者授予的平均星级)

的User_Name - 审阅的名称/别名

Review_Stars - 这审阅了多少明星给该酒楼

Review_Date - 审查的日期

User_Reviews - 这位评论者给出的关于他/她的酒店/餐厅评论历史的评论总数量为

User_Restaurant_Reviews - 相同的,但只是为餐馆

User_Helpful - 由其他审阅

所以我的逻辑是选择不同的USER_NAMES,他们的评论了多少的用户评论标记为有帮助,命令通过审查并将其限制为20.当我去添加AVG(REVIEW_STARS)时,它完全改变了答案。

SELECT DISTINCT USER_NAME, USER_REVIEWS 
FROM TRIPADVISOR 
ORDER BY USER_REVIEWS desc 
limit 20; 

RETURNS:

Dorian C 1329

Scipion-Paris 1219

Waddler 1213

CJTravelerTexas 937

runner-oh... 828

maurowave 818

gabrielct... 720

AJCG 667

pietro r 652

Albia-Newton 651

Jilllian 650

laserkid 648

pstiva 616

lucaheat 585

Chokk 511

Soracte 491

viaggiatr... 487

tornado9 479

Magorzata B 478

Marcello... 464

当我查询更改为:

SELECT DISTINCT USER_NAME, USER_REVIEWS, AVG(REVIEW_STARS) 
FROM TRIPADVISOR 
ORDER BY USER_REVIEWS desc 
limit 20; 

它返回: Iain U 60 4.3333

我觉得我的逻辑必须在我要对这个办法是关闭但如果任何人可以摆脱一些光它会帮助

回答

1

您错过了GROUP BY声明,您可能需要删除DISTINCT。你需要的东西沿线︰

SELECT USER_NAME, USER_REVIEWS, AVG(REVIEW_STARS) 
FROM TRIPADVISOR 
GROUP BY USER_NAME, USER_REVIEWS 
ORDER BY USER_REVIEWS desc 
limit 20; 
+0

哇谢谢,我该如何去除'DISTINCT',为什么我需要'GROUP BY'?你的查询看起来正在返回正确的数据,我只是好奇,所以我可以意识到我将来做错了什么 – bkennedy

+0

'DISTINCT'是非常愚蠢的。基本上采取所有显示的行并忽略重复。另一方面,'GROUP BY'允许在指定的列上执行聚合函数(在这种情况下为'AVG')。MySQL很奇怪,因为它不会强制你输入所有的列,这可能会返回一个意外的结果集 – ESG

+0

我想我并不是真的想要任何重复,因为我只想要20个人。那么这没有意义吗? – bkennedy