php - 什么 mysql 查询可以让我从这个表中按月获得汇总统计信息?

标签 php mysql

我的网站上有一个积分系统设置,其中累积的每个积分都记录在积分表中。结构很简单,p_userid,p_points(这个 Action 累积了多少点),p_timestamp。

我想显示每个月前 3 点累积用户。所以本质上,它应该对每个用户 ID 的月 p_points 表求和,并显示前 3 个用户,按月分组。用户 ID 将被加入到用户表中,以获取实际的用户名。

最好的方法是什么?我使用 php/mysql。

编辑: 作为一个可能的解决方案,我可以创建另一个列,并将 YYYY-MM 记录到其中,并根据它简单地对其进行分组,但对于一个已经很大的表来说,那是我必须记录的更多数据。

编辑 2:

这样存储的数据

INSERT INTO `points` (`point_userid`, `point_points`, `point_code`, `point_date`) VALUES
(8465, 20, 3, 1237337627),
(46745, 20, 3, 1237337678),
(7435, 20, 3, 1237337733),
(46565, 20, 3, 1237337802),
(4466, 20, 3, 1237337836),
(34685, 20, 3, 1237337885),
(8544, 20, 3, 1237337908),
(6454, 20, 3, 1237337998),
(45765, 20, 3, 1237338008),
(3476, 20, 3, 1237338076);

最佳答案

这在 MySQL 中并不容易。

首先你需要创建一个变量表,一个用于存储当前组,一个用于存储当前组中的行号。将它们都初始化为 NULL。

然后按月迭代分组并选择按分数排序的所有行并选择当前行数并增加它。如果组发生变化,请将行号重置为一。

然后将所有这些放在子选择中,在外部选择中,选择行号 <= 3 的所有行。

你可以使用这个查询:

SELECT month, p_userid, points FROM (
    SELECT
        *,
        (@rn := CASE WHEN month = @last_month THEN @rn + 1 ELSE 1 END) AS rn,
        (@last_month := month)
    FROM (
        SELECT p_userid, month(p_timestamp) AS month, SUM(p_points) AS points
        FROM Table1, (SELECT @last_month := NULL, @rn := 0) AS vars
        GROUP BY p_userid, month(p_timestamp)
        ORDER BY month, points DESC
    ) AS T1
) AS T2
WHERE rn <= 3

结果:

Month User Score
1     4    7
1     3    5
1     2    4
2     4    17
2     5    10
2     3    6

测试数据:

CREATE TABLE Table1 (p_userid INT NOT NULL,
                     p_points INT NOT NULL,
                     p_timestamp TIMESTAMP NOT NULL);

INSERT INTO Table1 (p_userid, p_points, p_timestamp) VALUES
(1, 1, '2010-01-01'),
(1, 2, '2010-01-02'),
(1, 3, '2010-02-01'),
(2, 4, '2010-01-01'),
(3, 5, '2010-01-01'),
(3, 6, '2010-02-01'),
(4, 7, '2010-01-01'),
(4, 8, '2010-02-01'),
(4, 9, '2010-02-02'),
(5, 10, '2010-02-02');

关于php - 什么 mysql 查询可以让我从这个表中按月获得汇总统计信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255710/

相关文章:

PHP登录系统: Remember Me (persistent cookie)

php - 为我的 URL 缩短器添加自定义 URL 支持

php - 基本日历构建 - 使用 pdo 输出 mysql 事件数据

php - 使用 PHP 基于 URL 参数选择多个下拉菜单

php - 为什么 COMPOSER_HOME 是空的?

PHP 字符串日期 + 1 天等于?

mysql - 如何将三张表拼接成一张表?

php - 为什么我的 WP 插件适用于同一系统上的一个人而不适用于另一个人?

c# - 我需要关闭数据读取器吗

MySQL:在一张表中引用多个表ID