我有一个记录用户活动的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查询将activity表中的条目汇总为单个用户的天数是相对简单的,我可以依次为每个用户运行这样的查询(尽管每个结果集中的days列可能不会完全对齐)。有没有一种方法可以在一个查询中自动为所有用户执行此操作?
我认为这可能有点奇怪,因为结果中的列数可能会根据感兴趣的日期范围内的活动用户的数量而变化。换句话说,报表中的列数可能少于数据库中的用户数。
本质上,我不是让MySQL生成一个一维数组的记录作为其输出,而是希望它生成一个二维数组的值,其中行和列的标签都是从活动表派生的。这有可能吗?
我想我总是可以遍历表中的原始数据并自己构建一个合适的二维数组(我将在PHP中工作),但我想知道MySQL是否可以为我做这件事。
发布于 2013-03-08 07:06:16
旋转(你正在尝试做的事情的专业术语)通常不值得麻烦。如果您只需要获取几个用户的数据,这是可以的,但是如果您需要能够获取用户的动态列表的数据,那么您最好执行按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;
}https://stackoverflow.com/questions/15283327
复制相似问题