Mysql获取条件中描述的所有记录,即使它在表中不存在

Dee*_*epu 8 mysql sql database select

考虑我有一个如下表:

MY_TABLE

+---------------+
| id  |  name   |
+---------------+
| 1   |  ABC    |
+---------------+
| 2   |  XYZ    |
+---------------+
| 3   |  PQR    |
+---------------+
| 4   |  LMN    |
+---------------+
Run Code Online (Sandbox Code Playgroud)

并说我有这样的查询

select * from my_table where id in (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

是否可以通过更改查询来获得如下所示的输出.

+---------------+
| id  |  name   |
+---------------+
| 1   |  ABC    |
+---------------+
| 2   |  XYZ    |
+---------------+
| 3   |  PQR    |
+---------------+
| 4   |  LMN    |
+---------------+
| 5   |  NULL   |
+---------------+
Run Code Online (Sandbox Code Playgroud)

我尝试使用自我JOIN和其他条件,也google很多,但没有找到解决方案.

谁有人建议解决方案?

Boh*_*ian 9

不幸的是,mysql没有内置函数来生成一系列其他数据库所做的系列.有(至少)两种方式:

硬编码所需的值作为子查询,然后左连接到您的表:

select x.id, t.name
from (select 1 id
  union select 2
  union select 3
  union select 4
  union select 5) x
left join my_table t on t.id = x.id
Run Code Online (Sandbox Code Playgroud)

但这很乏味且难以编码和维护.

或者(正如我之前所做的那样)创建一个表(一次)并填充自然数(一次)以用作代理系列生成器:

create table numbers (num int);
insert into numbers values (1), (2), (3), ... etc
Run Code Online (Sandbox Code Playgroud)

然后:

select n.num id, t.name
from numbers n
left join my_table t on t.id = n.num
where n.num in (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

一旦设置并填充了大量数字,这种方法非常方便.

您可以创建一个填充日期的类似表格,以类似的方式使用,这对于在并非所有日期都有数据的范围内为每个日期生成数字非常方便.