2014-01-13 49 views
0

这是一个我正在查询的问题,但对我来说感觉非常低效,我希望能帮助构建一个更好的问题。这将进入实时生产环境,db每天处理的查询数量非常高,因此效率越高越好。我有一个表的结构是这样的(剥离只是相关部分):从分组行中的同一列中获取特定值

id | type | datecolumn 
1 | A | 2014-01-01 
1 | B | 0000-00-00 
2 | A | 2014-01-02 
2 | B | 2014-01-10 
3 | A | 2014-01-01 
3 | B | 0000-00-00 

总是会有每个ID两行,A型的一个和类型的一个B. A将始终有一个有效的日期,而B将有一个日期> = A的日期,或全部为0。我要的是,这将产生类似输出的查询:

id | date for A | date for B 
1 | 2014-01-01 | None 
2 | 2014-01-02 | 2014-01-10 
3 | 2014-01-01 | None 

现在我这样做的方法如下:

SELECT 
    id, 
    IF(MIN(datecolumn) > 0, MIN(datecolumn), MAX(datecolumn)) AS 'date for A', 
    IF(MIN(datecolumn) > 0, MAX(datecolumn), 'None') AS 'date for B' 
GROUP BY id 

但它确实感觉我应该能够以某种方式按类型摘取日期列值。我知道最简单的解决方案应该是改变表结构,以便每个id只使用一行,但恐怕在这种情况下是不可能的;必须有两排。有没有在这个查询中正确利用类型列的方法?

编辑此外,这是一个将有超过10,000,000行的表上。再一次,效率是关键。

+0

我想这就是我该怎么做的。 – Strawberry

回答

0

我会坚持你去什么,但也许它写这样...

CREATE TABLE my_table 
(id INT NOT NULL 
,type CHAR(1) NOT NULL 
,datecolumn DATE NOT NULL DEFAULT '0000-00-00' 
,PRIMARY KEY(id,type) 
); 

INSERT INTO my_table VALUES 
(1 ,'A','2014-01-01'), 
(1 ,'B','0000-00-00'), 
(2 ,'A','2014-01-02'), 
(2 ,'B','2014-01-10'), 
(3 ,'A','2014-01-01'), 
(3 ,'B','0000-00-00'); 

SELECT id 
     , MAX(CASE WHEN type = 'A' THEN datecolumn END) a 
     , MAX(REPLACE(CASE WHEN type='B' THEN datecolumn END,'0000-00-00','none')) b 
    FROM my_table 
    GROUP 
    BY id; 
+----+------------+------------+ 
| id | a   | b   | 
+----+------------+------------+ 
| 1 | 2014-01-01 | none  | 
| 2 | 2014-01-02 | 2014-01-10 | 
| 3 | 2014-01-01 | none  | 
+----+------------+------------+ 
+0

这就是我一直在寻找的东西。谢谢! – DiMono

0

请确保您有一个涵盖ID和类型的列(如ALTER TABLE tbl ADD INDEX (type,id))的索引,然后执行:

SELECT 
    table_a.id, 
    table_a.datecolumn AS 'date for A', 
    IF(table_b.datecolumn > 0, table_b.datecolumn, 'None') AS 'date for B' 
FROM tbl AS table_a 
JOIN tbl AS table_b ON table_a.id = table_b.id AND table_b.type = 'B' 
WHERE table_a.type = 'A'; 
+0

如果这更快,我会吃我的短裤。 – Strawberry

+0

出于好奇,我很想看到你的答案对我的一些基准... – Jon

+0

这是一个将有超过10,000,000行的表。自加入不起作用。 – DiMono

相关问题