2014-02-20 23 views
0

我有一个缺少行的MYSQL表,并希望查询以便每周'GROUP'具有相同的行数。查询将虚拟数据放在缺失的行中

在这个例子中,我需要每个星期我有3天,我想在每个星期的输出进行进一步的处理相同的天数/行:

week,day,value 
1,1,101 
1,2,102 
1,3,103 
2,1,201 
2,2,202 
3,1,301 
3,2,302 

我想产生这样的事情 - 每个“周”具有相同的行数。

week,day,value 
1,1,101 
1,2,102 
1,3,103 
2,1,201 
2,2,202 
2,3,NULL 
3,1,301 
3,2,302 
3,3,NULL 

要么填写“价值”与零或空值,或者如果丢失一天被设置为NULL或某事会做 - 甚至一些默认值。行/天的数量总是相同的(在这种情况下为3),但可能在任何一周中缺失1天或更多天。

我有点难倒如何做到这一点。 将一个左连接到三行1,2,3的表是否可行?

真正的表格比较大,包含所有(周,日)的交叉引用表的手动创建不可行。

谢谢!

CREATE语句

CREATE TABLE `new1` (
    `week` int(11) DEFAULT NULL, 
    `day` int(11) DEFAULT NULL, 
    `value` varchar(45) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

插入语句

INSERT INTO test.new1 
(week, day, value) 
VALUES 
(1,1,101), 
(1,2,102), 
(1,3,103), 
(2, 1, 201), 
(2,2, 202), 
(3, 1, 301), 
(3, 2, 302); 

回答

2

你可以创造一切可能的周/日组合的列表,然后离开加入你现有的表拉过来的值:

SELECT a.*,b.value 
FROM (SELECT * 
     FROM (SELECT DISTINCT week FROM Table1) wk 
      ,(SELECT DISTINCT day FROM Table1) dy 
    )a 
LEFT JOIN Table1 b 
    ON a.week = b.`week` 
    AND a.day = b.`day` 

演示:SQL Fiddle

只需添加填料行:

INSERT INTO Table1 (`week`, `day`, `value`) 
    SELECT a.*,b.value 
    FROM (SELECT * 
      FROM (SELECT DISTINCT week FROM Table1) wk 
       ,(SELECT DISTINCT day FROM Table1) dy 
     )a 
    LEFT JOIN Table1 b 
     ON a.week = b.`week` 
     AND a.day = b.`day` 
    WHERE b.week IS NULL 
+0

啊我一见式留给自己和子查询JOIN来获得全套天。这很巧妙! – xcxc

+0

查询花了很长时间,所以我创建了第二个表,使用每周一天的子查询。但是,当我LEFT与原始表联接时,查询会在600s后超时......我将索引添加到两个表中一周和一天到两个,它的作品! (原来的一个是另一个大规模查询的结果,现在没有索引了)现在, – xcxc

+0

@xcx很高兴听到它,如果经常这样做,绝对值得创建一个永久的'驱动程序'表,它具有所有的组合这是你的追求。 –