2016-04-22 11 views
0

私は以下のような表を持っています。mySQL - 日付間の追加行を生成する

id  month  duration 
001 1/1/16 3 
002 3/1/16 4 
003 12/1/15 2 

指定された数字から1を引いた月の後の1か月ごとに新しい行をテーブルに追加したいとします。

id  month duration 
001 1/1/16 3 
001 2/1/16 3 
001 3/1/16 3 
002 3/1/16 4 
002 4/1/16 4 
002 5/1/16 4 
002 6/1/16 4 
003 12/1/15 2 
003 1/1/16 2 

このように、図示されていない列の値も複製します。

私は最初に「短い」データを入力してから長い間再構成したRでこれを行っていますが、オンラインで検索した後も、これはどのようにしてmySQLで行うのかわかりません。あなたの助けを前もってありがとう!

答えて

0

MySQLで簡単に行を生成できる場合は、あなたができないことを除いて。それでも、あなたは技術を使用することができ、いくつかの行を生成し、必要なデータを取得するためにJOINを使用するhereを説明:

この発電機を持つ
-- Create a VIEW with 16 dummy rows 
CREATE OR REPLACE VIEW generator_16 
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL 
    SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL 
    SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL 
    SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL 
    SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL 
    SELECT 15; 

を、あなたのクエリは次のようになります。

SELECT id, date_add(month, INTERVAL n MONTH), duration 
FROM tbl 
INNER JOIN generator_16 ON n < duration 
ORDER BY id, month 

私はあなたを想定し

CREATE TABLE tbl(id varchar(10), month date, duration int); 
INSERT INTO tbl VALUES('001', '2016-01-01', 3); 
INSERT INTO tbl VALUES('002', '2016-03-01', 4); 
INSERT INTO tbl VALUES('003', '2015-12-01', 2); 
+0

素晴らしい提案!私がmySQLに慣れていないので、私は消化して試してみる時間が必要です。あなたのお時間をありがとうございました! – stevenjoe

0

データ表示の問題は、プレゼンテーションレイヤー(たとえば、単純なPHPループ)で最もよく解決されますが、楽しみのためだけに...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,dt DATE NOT NULL 
,duration INT NOT NULL 
); 

INSERT INTO my_table VALUES 
(1,'2016-01-01',3), 
(2,'2016-03-01',4), 
(3,'2015-12-01',2); 

SELECT * FROM my_table; 
+----+------------+----------+ 
| id | dt   | duration | 
+----+------------+----------+ 
| 1 | 2016-01-01 |  3 | 
| 2 | 2016-03-01 |  4 | 
| 3 | 2015-12-01 |  2 | 
+----+------------+----------+ 

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT x.id,x.dt + INTERVAL y.i MONTH,x.duration FROM my_table x JOIN ints y ON y.i < x.duration; 
+----+---------------------------+----------+ 
| id | x.dt + INTERVAL y.i MONTH | duration | 
+----+---------------------------+----------+ 
| 1 | 2016-01-01    |  3 | 
| 1 | 2016-02-01    |  3 | 
| 1 | 2016-03-01    |  3 | 
| 2 | 2016-03-01    |  4 | 
| 2 | 2016-04-01    |  4 | 
| 2 | 2016-05-01    |  4 | 
| 2 | 2016-06-01    |  4 | 
| 3 | 2015-12-01    |  2 | 
| 3 | 2016-01-01    |  2 | 
+----+---------------------------+----------+ 
+0

素晴らしい提案!私がmySQLに慣れていないので、私は消化して試してみる時間が必要です。あなたのお時間をありがとうございました! – stevenjoe

関連する問題