次のシナリオを考えてみましょう: ユーザーは 1 つ以上の (銀行) 口座を持っています。アカウントの残高の履歴変更はテーブルで追跡されます。すべてのアカウントにわたって、ユーザーの資金の履歴を時系列で表示したいと考えています。これらはテーブル定義です:
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `accounts` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `balances` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`account_id` int(11) DEFAULT NULL,
`amount` int(11) DEFAULT NULL,
`created_at` date DEFAULT NULL,
PRIMARY KEY (`id`)
);
そして、ここにいくつかのサンプルデータがあります:
INSERT INTO `users` (`id`, `name`)
VALUES
(1,'Bob');
INSERT INTO `accounts` (`id`, `user_id`)
VALUES
(1,1),
(2,1);
INSERT INTO `balances` (`id`, `account_id`, `amount`, `created_at`)
VALUES
(1,1,100, '2012-01-01'),
(2,1,150, '2012-01-02'),
(3,2,1000,'2012-01-04'),
(4,2,1100,'2012-01-08'),
(5,1,175, '2012-01-10');
ユーザーは、アカウント全体で 1 日 1 回の入出金しか許可されていないため、created_at
値は一意であると見なすことができます。
サンプル データが与えられた場合、書きたいクエリの結果は次のようになります。
|'2012-01-01'|100 |
|'2012-01-02'|150 |
|'2012-01-04'|1150|
|'2012-01-08'|1250|
|'2012-01-10'|1275|
計画は次のとおりです。
- 残高テーブルからすべての一意の日付を取得します。
- 各日付について、残高の日付がステップ 1 の日付を超えないように、各アカウントの最新の残高を選択します。
- NULL 値を無視して、手順 2 で見つかった金額を合計します。NULL 値は、そのアカウントの最初に記録された残高が後日のものであることを意味します。
ステップ 2 の条件を定式化するのに問題があります。