2014-02-12 48 views
0

根據用戶條件,如果數據不存在,MySQL可以創建新的虛擬行?
我的查詢看起來是這樣的:SQL:命令創建虛擬行如果不存在

SELECT year, value, type FROM myTable 
WHERE year BETWEEN ('2010' AND '2013') AND type IN ('Oil', 'Gas'); 

輸出:

year | value | type 
    --------------------- 
    2013 | 0 | Oil 
    2012 | 144.5 | Oil 
    2012 | 434.3 | Gas 
    2011 | 141.0 | Oil 
    2011 | 1234 | Gas 
    2010 | 4567 | Gas 
    --------------------- 

我想運行,將這樣的輸出記錄的查詢:

year | value | type 
    --------------------- 
    2013 | 0 | Oil 
    2013 | 0 | Gas // -> new virtual* row 
    2012 | 144.5 | Oil 
    2012 | 434.3 | Gas 
    2011 | 141.0 | Oil 
    2011 | 1234 | Gas 
    2010 | 4567 | Gas 
    2010 | 0  | Oil // -> new virtual* row 
    --------------------- 

用戶想同時顯示'Gas'和'Oil',但自2013年以來只包含'Oil'類型,因此我想創建'Gas'的新記錄,其值爲0,然後與2010年相同(基於期望的輸出以上)。

編輯:

CREATE TABLE `myTable` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `type` varchar(15) DEFAULT NULL, 
    `year` year(4) DEFAULT NULL, 
    `value` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=92278 DEFAULT CHARSET=latin1 
+0

您可以輕鬆地提供客戶端(PHP)這種觀點,那麼你爲什麼要搜索這種類型的查詢? –

+0

因爲你只有石油和天然氣? – Mihai

+0

「類型」也是動態的,它可以包含任何類似'煤炭','權力'等取決於用戶輸入。 (實際上,我有兩個表格,一個是值,另一個是typeNames)。 – 1mr3yn

回答

1

至於你提到你確實有2個表。

我寧願不污染數據庫與這些0值,但如果你堅持。

INSERT INTO data 
SELECT 
    cross_join.year as year, 
    0 as value, 
    cross_join.id as type_id 
FROM data 
RIGHT JOIN (
    SELECT types.id, year 
    FROM types 
    JOIN (SELECT DISTINCT year FROM data) distinct_years 
) cross_join ON (cross_join.id = data.type_id AND cross_join.year = data.year) 
WHERE data.year IS NULL 

另一種方法是幾乎在查詢過程中添加這些行,我寧願

SELECT 
    COALESCE(data.year, cross_join.year) as year, 
    COALESCE(data.value, 0) as value, 
    COALESCE(data.type_id, cross_join.id) as type_id 
FROM data 
RIGHT JOIN (
    SELECT types.id, year 
    FROM types 
    JOIN (SELECT DISTINCT year FROM data) distinct_years 
) cross_join ON (cross_join.id = data.type_id AND cross_join.year = data.year); 

Demo can be found here.

+0

gracias!第二個查詢是我正在尋找的那個,對不起,如果我沒有說清楚(在我的問題上),我更喜歡虛擬行。乾杯! – 1mr3yn

相關問題