我有一个像这样的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
答案 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
的数字加上一千左右。也许从1
到1000000
是安全的。无论如何,你只需要确保它足够高,以涵盖你将遇到的任何可能的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