mySQL按表中值的总和排序

时间:2017-02-07 20:56:07

标签: mysql ranking

我有一个mySQL数据库表,用于存储发送给人们的消息。每条消息都可以包含点。我想知道是否有一个查询可以总结每个人的所有积分并按等级排序?

目前我知道如何获得我想要的输出的唯一方法就是运行:

SELECT SUM(messagePoints) AS totalPoints FROM Messages

然后将结果存储在PHP中,并按totalPoints对结果进行排序。我确信有一种方法可以完全通过查询来完成,但我不知道从哪里开始。希望有人能给我一些建议。

Messages表示例

 messageID  |  personID  |  dateOfMessage          |  messagePoints
 ----------------------------------------------------------------
 1          |   10       |    2017-01-05 00:00:00  |     5
 2          |   10       |    2017-01-16 00:00:00  |     3
 3          |   20       |    2017-01-16 00:00:00  |     4
 4          |   10       |    2017-02-01 00:00:00  |     6
 5          |   20       |    2017-02-07 00:00:00  |     7

理想的结果:

personID |  totalPoints  |  rank
--------------------------------
10       |  14           |  1
20       |  11           |  2

如果可以进行上述输出,我想知道是否可以使用日期范围过滤器生成相同的输出,例如仅显示2月份的消息。

理想结果仅限2月消息:

personID |  totalPoints  |  rank
--------------------------------
20       |  7            | 1
10       |  6            | 2

编辑:

如果它更容易,我最终需要在我的应用程序中显示1个人的总积分和等级(由PHP提供),即仅personID = 10的结果我需要总积分和总排名按日期过滤。所以可能有4个单独的查询。

personID = 10的理想总体结果:

totalPoints 
-----------
14   

rank
----
1

personID = 10的理想结果在2月过滤:

totalPoints 
-----------
6   

rank
----
2

2 个答案:

答案 0 :(得分:1)

如果您不需要结果中的排名 - 这是一个基本的聚合查询:

select m.personID, sum(messagePoints) as totalPoints
from messages m
group by m.personID
order by totalPoints desc

在结果中包含行号(排名)的一种方法是使用具有AUTO_INCREMENT列的临时表作为排名:

drop temporary table if exists tmp_messages;
create temporary table tmp_messages(
  rank int auto_increment primary key,
  personID int,
  totalPoints int
) as
    select null as rank, m.personID, sum(messagePoints) as totalPoints
    from messages m
    group by m.personID
    order by totalPoints desc;

select * from tmp_messages order by rank;

您可以在WHERE子句中包含fllters,如:

select m.personID, sum(messagePoints) as totalPoints
from messages m
where m.dateOfMessage >= '2017-02-01'
  and m.dateOfMessage <  '2017-03-01'
group by m.personID

您可以选择特定用户:

select * from tmp_messages where personID = 10

演示:http://rextester.com/ASWF7717

答案 1 :(得分:-1)

您可以尝试以下代码来获得排名,您可以使用where子句来过滤日期。

select personID, SUM(messagePoints) AS totalPoints,@curRank := @curRank + 1 AS rank 
from Messages, (select @curRank :=0) r
group by personID
order by totalPoints