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

Posted

技术标签:

【中文标题】mysql获取条件中描述的所有记录,即使表中不存在【英文标题】:Mysql get all records described in in condition even if it does not exists in table 【发布时间】:2015-02-19 02:05:30 【问题描述】:

假设我有一个如下表:

我的表

+---------------+
| id  |  name   |
+---------------+
| 1   |  ABC    |
+---------------+
| 2   |  XYZ    |
+---------------+
| 3   |  PQR    |
+---------------+
| 4   |  LMN    |
+---------------+

说我有这样的查询

select * from my_table where id in (1,2,3,4,5)

是否可以通过更改查询获得如下输出。

+---------------+
| id  |  name   |
+---------------+
| 1   |  ABC    |
+---------------+
| 2   |  XYZ    |
+---------------+
| 3   |  PQR    |
+---------------+
| 4   |  LMN    |
+---------------+
| 5   |  NULL   |
+---------------+

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

谁能提出解决方案?

【问题讨论】:

在什么情况下您期望空结果? 一般来说,您不能从该表中不存在的表中选择数据,您也不想这样做 @Juergen 的回答是正确的。他不应该删除它。 但是我问过他如果我有 100 条或 1000 条记录怎么办。我需要在查询中写下它们中的每一个吗? @GordonLinoff 林诺夫 @웃웃웃웃웃 。 . .您需要以某种方式将它们放入查询中。通常,当您有大量这样的数字时,它们已经在一个表中,因此您可以使用表或查询来读取它们。 【参考方案1】:

您可以创建一个数字系列,而无需创建额外的表格或为每个需要搜索的值编写条件。 You can use a variable rownum, initialize with value 0 & increase it by 1 to easily create a serie by using ‘limit’。我使用了INFORMATION_SCHEMA.COLUMNStable,因此您可以创建一个大系列(您可以使用数据库中任何更大的表或任何足够大以满足您的需要的表)。

SQL Fiddle

MySQL 5.6.6 m9 架构设置

CREATE TABLE my_table
    (`id` int, `name` varchar(3))
;

INSERT INTO my_table
    (`id`, `name`)
VALUES
    (1, 'ABC'),
    (2, 'XYZ'),
    (3, 'PQR'),
    (4, 'LMN')
;

查询 1

select rownum id, name 
from (
select @rownum:=@rownum+1 as rownum
from INFORMATION_SCHEMA.COLUMNS,(SELECT @rownum:=0) r limit 5) as num
left outer join my_table on id = rownum

Results

| ID |   NAME |
|----|--------|
|  1 |    ABC |
|  2 |    XYZ |
|  3 |    PQR |
|  4 |    LMN |
|  5 | (null) |

【讨论】:

【参考方案2】:

您可以像以前一样使用子句 IN,也可以在此处看到 http://www.tutorialspoint.com/mysql/mysql-in-clause.htm

我自己进行了测试,它返回的名称符合预期,从 1 到 4,但是当我输入一个不存在的 id 时,mysql 查询将不会返回此 id 的任何内容,因为它在数据库中不存在。

SELECT * FROM employee_tbl WHERE id IN ( 1,2,3,4,5,6,7,8);

1   John    250
2   Ram     220
3   Jack    170
4   Jack    100
5   Jill    220
6   Zara    300
7   Zara    360

如果你真的想要这个表,我想你可以尝试一些存储过程来格式化输出表。在这里您可以了解更多信息。 http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html 和这里'IF' in 'SELECT' statement - choose output value based on column values

【讨论】:

【参考方案3】:

不幸的是,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

但这很乏味,难以编码和维护。

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

create table numbers (num int);
insert into numbers values (1), (2), (3), ... etc

然后:

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)

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

您可以创建一个包含日期的类似表格,以类似的方式使用,当并非所有日期都有数据时,这对于为某个范围内的每个日期生成数字非常方便。

【讨论】:

以上是关于mysql获取条件中描述的所有记录,即使表中不存在的主要内容,如果未能解决你的问题,请参考以下文章

MySQL内部连接查询以获取其他表中不存在的记录

MYSQL查询A表中不存在于B表中的所有符合条件的数据

从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录

SQLite查询选择另一个表中不存在的所有记录

即使数据库中不存在也显示记录

即使数据库中不存在,也要显示记录