8

我有一个这样的 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

4

6 回答 6

10

答案很简单

select (select max(id) from mytable)+1 as id, NULL as Name, 0 as count union all select id,Name,count from mytable;
于 2016-02-17T11:46:26.247 回答
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 条或更多。然后,您可以简单地将其与具有原始记录的表连接起来。例如,假设您有一个名为DummyRecord1 列的表并且上面有 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
于 2012-08-24T13:21:53.703 回答
2

只需使用 mysql ROLLUP

SELECT * FROM your_table
      GROUP BY Name WITH ROLLUP;
于 2014-06-02T12:00:43.350 回答
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
于 2012-08-24T13:27:46.540 回答
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而不需要带有联合列表的子查询;但是,提供的其他解决方案同样适用于一个小的已知列表(并且也可以动态生成)。

于 2012-08-24T13:29:08.020 回答
0

为了澄清这一点,可以将额外的行附加到结果集中

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

结果

 id  | name
------------
***  |  ***
***  |  ***
123  |  abc
于 2020-11-12T21:08:46.953 回答