1

我有一个 MySQL 表,它具有以下记录用户活动的模式:

TABLE Activity:
id      INT AUTOINCREMENT  // the primary key
ts      TIMESTAMP          // similar to DATETIME
user    INT                // a unique ID for each user
action  INT                // action code 

每次用户执行操作时,都会在此表中添加一行。我现在要做的是生成一份总结每天总用户活动的报告。例如,它看起来像这样:

Date       | User 1 | User 2 | User 3
--------------------------------------
2013-03-05 |     12 |     34 |     56
2013-03-06 |     78 |     87 |     65
2013-03-07 |     43 |     21 |     12

在这个例子中,用户 1 在 3 月 6 日做了 78 次操作,在 3 月 7 日做了 43 次操作,而用户 3 在 3 月 5 日做了 56 次操作。此时我不在乎某一天做了什么样的操作,只要特定用户执行的所有操作的总数。

现在编写一个 MySQL 查询将活动表中的条目汇总为单个用户的天数相对简单,我可以依次为每个用户运行这样的查询(尽管每个结果集中的天数列可能不会完全对齐)。有没有办法在一个查询中自动为所有用户执行此操作?

我认为这可能有点奇怪,因为结果中的列数可能会根据感兴趣的日期范围内有多少用户处于活动状态而有所不同。换句话说,报表中的列数可能少于数据库中的用户数。

本质上,与其让 MySQL 生成一维记录数组作为其输出,我希望它生成一个二维值数组,其中行和列的标签来自活动表。这甚至可能吗?

我想我总是可以浏览表中的原始数据并自己构建一个适当的二维数组(我将使用 PHP),但我想知道 MySQL 是否可以为我做这件事。

4

1 回答 1

1

枢轴(您正在尝试做的事情的技术术语)通常不值得麻烦。如果您只需要获取少数用户的数据,那很好,但如果您需要能够获取动态用户列表的数据,那么您最好执行按以下方式分组的单个ts查询user

SELECT DATE(`ts`) AS `Date`, `User`, COUNT(*) AS `Actions`
FROM `Activity`
#WHERE (conditions)
GROUP BY `Date`, `User`

并在 PHP 中创建一个多维数组,如下所示:

$result; // result from DB call as an array of objects
$user_actions = array();
foreach($result as $row){
    $user_actions[$row->Date][$row->User] = $row->Actions;
}
于 2013-03-07T23:06:16.350 回答