2016-08-17 70 views
0

我正在做一个食物评论的网页,有一个名为top 10的页面,根据食物评论它将显示前10名。我目前有这个SQL,但它结合了所有的菜肴评分和组合为一盘。这条SQL语句被放置在PHP代码中。SQL语句没有正确分组

SELECT i.path, i.name, AVG(r.review_rating), r.image_id 
    FROM images i, review r 
WHERE r.image_id = i.id 
GROUP BY 'r.image_id' 
ORDER BY AVG(r.review_rating) DESC 
LIMIT 10 
+0

欢迎来到Stack Overflow。请尽快阅读[关于]页面和[询问]页面。 “不工作”并不能很好地表征问题。使用SQL,我们确实需要查看查询中每个表的大纲模式,以及一些(2-5?)行数据,并描述了您所看到的以及您想查看的内容。简单地给出表名,列名和样本值而没有正式模式就足够了。 –

+0

GROUP BY子句中'r.image_id'附近的引号是什么?它们似乎是单引号,所以您按照常量字符串进行分组,这可能意味着您只能获得一个组,因为组“列”(值)只有一个值。如果你正在使用MySQL(这是一个好主意,以确定你正在使用SQL问题的数据库管理系统),你可能打算使用''GROUP BY'r'.'image_id''虽然坦率地说我会使用'GROUP BY r.image_id'。 –

+0

而老式的'FROM table1,table2'表示法被SQL-92过时了。你不应该在20年后写成的SQL中使用它。 –

回答

1

没有看到你的sql模式,很难确切地知道你需要改变它到什么。但它看起来像你可能想要使用JOIN而不是从多个表中选择。试一下这个:(10个或更多的独特r.image_id的,您可以通过删除GROUP BY,看着检查的结果,这一点)

SELECT i.path, 
    i.name, 
    AVG(r.review_rating), 
    r.image_id 
FROM images i 
JOIN review r ON r.image_id = i.id 
GROUP BY r.image_id 
ORDER BY AVG(r.review_rating) DESC 
LIMIT 10 

你还需要检查是否有实际10倍不同的图像。

如果这不起作用,然后张贴您的架构。

+0

我相信如果少于10个,它会显示有多少个对吗? – user3567749

+0

@ user3567749:如果少于10行,它将显示所有可用的行。 –

1

问题出在GROUP BY 'r.image_id'
'r.image_id'是一个字符串,这使得GROUP BYWHERE子句过滤的所有行中创建一个组。您可能想要GROUP BY r.image_id

了解更多关于何时在MySQL中使用apostrophes, quotes and backticks的信息。