tominator
私はそれがために実行する必要がありますIDをハードコーディングするときに動作し、特定のクエリを、持っています。私は、データベース内のすべてのIDのためにそれを実行したいと思います。
これは代表的なセットアップです。
CREATE TABLE `dummy` (
`total` INT(11) NULL DEFAULT NULL,
`a_id` INT(11) NULL DEFAULT NULL,
`month` INT(11) NULL DEFAULT NULL
);
Data:
total | a_id | month
2 | 1 | 3
4 | 1 | 5
3 | 1 | 6
6 | 1 | 9
3 | 2 | 4
6 | 2 | 10
CREATE TABLE `months` (
`month` INT(11) NULL DEFAULT NULL
);
Data: Just the values 1 through 12
私は何を達成したいことを使用することでmonth
、タイムスタンプとして、それぞれのためにa_id
と、その月の彼らの合計を取得するゼロ(ただし、設定されていないか月間のみ最初の月の間に、先月、そのa_id
) 。
これまでの私のクエリ:
SELECT c.month, COALESCE(d.total, 0) AS 'total', COALESCE(d.a_id, 1) AS 'a_id'
FROM (
SELECT month
FROM months
WHERE month >= (SELECT MIN(month) FROM dummy WHERE a_id = 1)
AND month <= (SELECT MAX(month) FROM dummy WHERE a_id = 1)
) c
LEFT outer JOIN (
SELECT *
FROM dummy
WHERE a_id = 1
) d ON d.month = c.month
ORDER BY c.month;
そして、その出力:
month | total | a_id
3 | 2 | 1
4 | 0 | 1
5 | 4 | 1
6 | 3 | 1
7 | 0 | 1
8 | 0 | 1
9 | 6 | 1
どのように私はこのクエリを変更し、ための出力を得ることができ、すべての a_id
テーブルでは、PHPのような外部プログラムなしでIDを毎回変えますか?
明菜:
それはあなたが必要と思われます
SELECT months.month,
COALESCE(dummy.total, 0) total,
a_ids.a_id
FROM months
CROSS JOIN ( SELECT DISTINCT a_id
FROM dummy ) a_ids
LEFT JOIN dummy ON months.month = dummy.month
AND a_ids.a_id = dummy.a_id
INNER JOIN ( SELECT MIN(month) min_month,
MAX(month) max_month
FROM dummy ) borders ON months.month BETWEEN borders.min_month
AND borders.max_month
ORDER BY a_ids.a_id, months.month;
若しくは
SELECT months.month,
COALESCE(dummy.total, 0) total,
a_ids.a_id
FROM months
CROSS JOIN ( SELECT DISTINCT a_id
FROM dummy ) a_ids
LEFT JOIN dummy ON months.month = dummy.month
AND a_ids.a_id = dummy.a_id
INNER JOIN ( SELECT MIN(month) min_month,
MAX(month) max_month,
a_id
FROM dummy
GROUP BY a_id ) borders ON months.month BETWEEN borders.min_month
AND borders.max_month
AND a_ids.a_id = borders.a_id
ORDER BY a_ids.a_id, months.month;