在MySQL select查询的结果中添加一行

时间:2012-08-24 13:17:25

标签: 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

6 个答案:

答案 0 :(得分:7)

答案很简单

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

答案 1 :(得分: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

您可以简单地生成一个包含1列的表,最好使用名称( ID ),其记录可能超过10,000或更多。然后你可以简单地将它与你的具有原始记录的表一起加入。例如,假设您有一个名为DummyRecord的表,其中包含1列且其上有10,000行

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到100,那么你可以使用这个条件

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

答案 2 :(得分:2)

只需使用mysql ROLLUP

SELECT * FROM your_table
      GROUP BY Name WITH ROLLUP;

答案 3 :(得分: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

答案 4 :(得分: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列表,而无需带有联合列表的子查询;但是,提供的其他解决方案同样适用于一个小的已知列表(也可以动态生成)。

答案 5 :(得分:0)

为澄清这一点,人们可以如何在结果集上追加一行

select * from table union select 123 as id,'abc' as name

结果

 id  | name
------------
***  |  ***
***  |  ***
123  |  abc