我有一个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
答案 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
答案 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