2012-02-24 58 views
1

我有两个SQL表:SQL查询 - 如何获得最高评价的项目?

item 
id name price 
1 name1 100 
2 name2 100 
3 name3 100 
4 name4 100 

rates 
id item_id rating 
1 1  5 
2 4  4 
3 2  5 
4 2  3 
5 3  1 
... 

而且我想要显示3项最高平均得分。我应该怎么做?

我得到的平均项目评分这样的:

$item = mysql_query("SELECT * FROM item"); 
while($row = mysql_fetch_assoc($item)) { 
    $id = $row['id']; 
    $rate= mysql_query("SELECT AVG(rating) FROM rates WHERE id= $id"); 
} 

回答

4

你可以计算出平均值最高在派生表,并加入到:

select i.id, i.name, i.price 
from item i 
join (
    select id, avg(rating) as ar 
    from rates 
    group by id 
    order by ar desc, id 
    limit 3 
) dt on i.id = dt.id; 

我加id到ORDER BY强制在你有重复的情况下一致的结果。

1
$item = mysql_query("SELECT i.*, (SELECT AVG(`rating`) FROM `rates` WHERE `item_id` = i.`id`) AS `rating` FROM `item` i ORDER BY `rating` DESC LIMIT 3"); 

您是否尝试过运行像这样子查询?我认为这不是最有效或最准确的方法,但它可能会给你一个基本的结果,你可能会觉得有用。

理想情况下,你会处理这在后端消除游戏(在标准偏差异常值),并保持存储每个项目恒定的平均,但可能是因为你可能需要的东西太复杂。