统计记录,平均记录和排名记录

时间:2014-10-17 03:00:45

标签: mysql sql

我知道这个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的总记录

根据投票数排名

点列我稍后会使用,为什么排名列不是基于它

提前谢谢^へ^

2 个答案:

答案 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

Fiddle Demo

注意:

您的预期结果对于ID 1的平均值不正确,应该是6.5而不是7.5

输出:

+----+-----------+-------+------+
| ID | POINT_AVG | VOTES | RANK |
+----+-----------+-------+------+
|  1 | 6.5       |     2 |    2 |
|  2 | 8         |     3 |    1 |
+----+-----------+-------+------+