我有两个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");
}
答案 0 :(得分: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;
我在ORDER BY中添加了id
,以便在您有重复项的情况下强制执行一致的结果。
答案 1 :(得分: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");
您是否尝试过像这样运行子查询?我不认为这是最有效或最准确的方法,但它可能会给你一个有用的基本结果。
理想情况下,您将在后端处理此操作以消除游戏(标准偏差中的异常值)并保持每个项目的平均存储空间,但这可能过于复杂而无法满足您的需求。