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 

ユーザーがアクションを実行するたびに、このテーブルに行が追加されます。ここでやりたいことは、1 日あたりの合計ユーザー アクティビティを要約したレポートを生成することです。たとえば、次のようになります。

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 回のアクションを実行しました。特定のユーザーによって実行されたすべてのアクションの合計数。

アクティビティ テーブルのエントリを 1 人のユーザーの日数に要約する MySQL クエリを作成するのは比較的簡単で、このようなクエリをユーザーごとに順番に実行できます (ただし、各結果セットの日数列は完全に一致しない場合があります)。1 つのクエリですべてのユーザーに対して自動的にこれを行う方法はありますか?

結果の列の数は、関心のある日付範囲でアクティブだったユーザーの数によって異なる可能性があるため、これは少し奇妙かもしれません. つまり、レポート内の列の数は、データベース内のユーザー数よりも少ない場合があります。

基本的に、MySQL に出力としてレコードの 1 次元配列を生成させるのではなく、値の 2 次元配列を生成させたいと考えています。ここで、行と列のラベルはアクティビティ テーブルから派生します。これは可能ですか?

テーブル内の生データを調べて、自分で適切な 2 次元配列を構築することはいつでもできると思いますが (私は 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 に答える