我知道这个Q有很多线程,但答案与我想要的有点不同,我不太了解&#39;回合sql所以不知道如何改变他们的查询,因为我想要< / p>
我有一个这样的表,用户将投票和DB记录产品点
id | name | point
1 | foo | 8
2 | bar | 6
2 | bar | 9
2 | bar | 9
1 | foo | 5
现在我想要一个显示结果的查询
id | name | AVG point | votes | rank
1 | foo | 7.5 | 2 | 2
2 | bar | 8 | 3 | 1
AVG point col是每个id
的平均值投票是每个id的总记录
根据投票数排名
点列我稍后会使用,为什么排名列不是基于它
提前谢谢^へ^
答案 0 :(得分:1)
您必须使用聚合器,您需要平均聚合器,计数聚合器,最后需要@curRow:= @curRow + 1 AS row_number作为您的等级。
要使用聚合器,您需要group by子句。
Select Id,name, avg(point), count(point), @curRow := @curRow + 1 AS row_number
from table
group by Id, name
order by avg(point) desc
答案 1 :(得分:1)
这个获得你的排名的问题是你必须在计算变量之前订购它才能以正确的顺序获得它。也就是说,最大的选票具有最小的排名
SELECT id, point_avg, votes, rank
FROM
( SELECT *, @A:= @A + 1 AS rank
FROM
( SELECT id, AVG(point) AS point_avg, COUNT(*) AS votes
FROM votes
GROUP BY id
ORDER BY COUNT(*) DESC
)t, (SELECT @A:= 0)temp
)t1
ORDER BY id
您的预期结果对于ID 1的平均值不正确,应该是6.5而不是7.5
+----+-----------+-------+------+
| ID | POINT_AVG | VOTES | RANK |
+----+-----------+-------+------+
| 1 | 6.5 | 2 | 2 |
| 2 | 8 | 3 | 1 |
+----+-----------+-------+------+