2012-08-24 78 views
7

我使用的是MySQL表像這樣添加一個額外的行到MySQL選擇查詢的結果

id Name count 
1 ABC 1 
2 CDF 3 
3 FGH 4 

只需選擇查詢我得到的值作爲

1 ABC 1 
2 CDF 3 
3 FGH 4 

我怎樣才能得到結果像這樣

1 ABC 1 
2 CDF 3 
3 FGH 4 
4 NULL 0 

您可以看到最後一行。當記錄完成時,應添加此格式的額外行 last_id+1, Null ,0。你可以看到上面。即使我原來的桌子上沒有這樣的排。可能有N行不固定3,4

+1

你不能。直到它真正存在於表格中。 – hjpotter92

+0

@ Nerd-Herd我不確定這是真的。 –

+1

@ Nerd-Herd我相信這不是事實。 – GolezTrol

回答

2

這看起來有點亂,但它應該工作。

SELECT a.id, b.name, coalesce(b.`count`) as `count` 
FROM 
    (
    SELECT 1 as ID 
    UNION 
    SELECT 2 as ID 
    UNION 
    SELECT 3 as ID 
    UNION 
    SELECT 4 as ID 
    ) a LEFT JOIN table1 b 
     ON a.id = b.id 
WHERE a.ID IN (1,2,3,4) 

更新1

你可以簡單地生成具有最好用的域名(ID)1列的表中有記錄可能高達10000以上。然後,您可以簡單地將它與您的具有原始記錄的表一起加入。例如,假設你有一個表名爲DummyRecord有1列,上有

SELECT a.id, b.name, coalesce(b.`count`) as `count` 
FROM DummyRecord a LEFT JOIN table1 b 
     ON a.id = b.id 
WHERE a.ID >= 1 AND 
     a.ID <= 4 

就是這樣10,000行。或者,如果你想擁有從10到100,那麼你可以使用這個條件

... 
WHERE a.ID >= 10 AND 
     a.ID <= 100 
+0

表中有很多行不只一個到四個,我們需要動態地採取它 – Warrior

+0

@戰士啊好吧,我明白了。我剛剛更新了答案。 :) –

0
select 
    x.id, 
    t.name, 
    ifnull(t.count, 0) as count 
from 
    (SELECT 1 AS id 
    -- Part of the query below, you will need to generate dynamically, 
    -- just as you would otherwise need to generate 'in (1,2,3,4)' 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    UNION ALL SELECT 4 
    UNION ALL SELECT 5 
) x 
    LEFT JOIN YourTable t 
    ON t.id = x.id 
0

如果id不在你從選擇表中,你需要LEFT JOIN反對要返回的每個id的列表 - 這樣,它將爲不存在的值返回null值,併爲那些值返回真值。

我建議建立一個numbers表是一個充滿數字的單列的表格:

CREATE TABLE `numbers` (
    id int(11) unsigned NOT NULL 
); 

然後將大量的數字,開始在1和馬上要到你的想法的最高id你會看到加上一千左右。也許從11000000是安全的。無論如何,你只需要確保它已經超過了足夠高的範圍,以覆蓋你將會遇到的任何可能的id

之後,你的查詢可以是這樣的:

SELECT n.id, a.* 
FROM 
    `numbers` n 
    LEFT JOIN table t 
     ON t.id = n.id 
WHERE n.id IN (1,2,3,4); 

該解決方案將允許對ids而不需要一個子查詢與工會列表的動態增長列表;儘管如此,所提供的其他解決方案也同樣適用於小型已知列表(也可以動態生成)。

+0

你不能忘記確保數字表足夠大。如果有人決定在其中放入「約一百萬」的記錄,並且在幾年後另一張桌子增長到超過一百萬,那麼這件事可以很容易地被遺忘。 (是的,發生了!)但除此之外,它是我的答案的不錯選擇。儘管(數字列表)仍然需要「生成」查詢的一部分,所以它並不容易。 – GolezTrol

2

只需使用mysql ROLLUP

SELECT * FROM your_table 
     GROUP BY Name WITH ROLLUP; 
5

答案很簡單

select (select max(id) from mytable)+1 as id, NULL as Name, 0 as count union all select id,Name,count from mytable; 
+0

這是我所遇到的最準確的答案。 – Ronu