今天,我想在数据库中为每个用户创建分数方面获得帮助。我有这个查询:
SELECT
r1.id,
r1.nickname,
r1.fecha,
r1.bestia1,
r1.bestia2,
r1.bestia3,
r1.bestia4
r1.bestia5
FROM
reporte AS r1
INNER JOIN
( SELECT
nickname, MAX(fecha) AS max_date
FROM
reporte
GROUP BY
nickname ) AS latests_reports
ON latests_reports.nickname = r1.nickname
AND latests_reports.max_date = r1.fecha
ORDER BY
r1.fecha DESC
来自该站点的一位朋友,他帮助我获得了“每天每位用户的最新记录”,基于此,我正在研究如何每天,每周或每月对排名结果进行计数,以便使用统计图表或google datastudio,我已经尝试了下一个:
select id, nickname, sum(bestia1), sum(bestia2), etc...
但是它没有给出我想要的完整结果。那就是为什么我在寻求帮助。另外,我知道datastudio过滤器可以在其中显示许多图表,但仍然可以完全计数。
例如,在过去30天中,有一位玩家报告说有265个怪物被杀死,但是当我在datastudio中使用我的查询时,它只计算最新值(可以是12)。所以我想正确计数以便与图表一起使用用我的查询过滤的SQL记录:
答案 0 :(得分:1)
这将为您提供每位用户最近30天内杀死的怪物数量:
SELECT
nickname,
sum(bestia1) as bestia1,
sum(bestia2) as bestia2,
sum(bestia3) as bestia3,
sum(bestia4) as bestia4,
sum(bestia5) as bestia5
FROM
reporte
WHERE fecha >= DATE_ADD(curdate(), interval -30 day)
GROUP BY nickName
ORDER BY
答案 1 :(得分:1)
一种用于获取每个用户在最近X天内杀死的怪物总数并进行得分计算(如您在评论中建议的得分计算)的通用方法如下:
SET @daysOnHistory = X; -- Where X should be an integer positive number (like 10).
SELECT
nickname,
SUM(bestia1) AS total_bestia1_killed,
SUM(bestia2) AS total_bestia2_killed,
SUM(bestia3) AS total_bestia3_killed,
SUM(bestia4) AS total_bestia4_killed,
SUM(bestia5) AS total_bestia5_killed,
SUM(bestia1 + bestia2 + bestia3 + bestia4 + bestia5) AS total_monsters_killed,
SUM(bestia1 + 2 * bestia2 + 3 * bestia3 + 4 * bestia4 + 5 * bestia5) AS total_score
FROM
reporte
WHERE
fecha >= DATE_ADD(DATE(NOW()), INTERVAL -@daysOnHistory DAY)
GROUP BY
nickname
ORDER BY
total_score DESC
现在,如果您要进行相同的计算,但仅考虑当前一周的天(假设一周从星期一开始),则需要替换前面的WHERE
子句在下一个之前:
WHERE
fecha >= DATE_ADD(DATE(NOW()), INTERVAL -WEEKDAY(NOW()) DAY)
甚至,如果您希望全部相同,但仅考虑当月的天,则需要用以下内容替换WHERE
子句:
WHERE
MONTH(fecha) = MONTH(NOW())
要评估当年天的统计信息,您需要将WHERE
子句替换为:
WHERE
YEAR(fecha) = YEAR(NOW())
最后,要在特定日期范围内进行评估,您可以使用,例如:
WHERE
DATE(fecha) BETWEEN CAST("2018-10-15" AS DATE) AND CAST('2018-11-10' AS DATE)
我希望本指南对您有所帮助并阐明您的观点。