2014-01-13 76 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

相關問題