2012-08-24 33 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