MySQL从子查询返回数组,以及NULL



我有两个表,"records"one_answers"info"。

"记录"表看起来像:

mysql> SELECT * FROM records WHERE num = '7';
+-----+--------+----+------+-----+-----+------------+-----------+----------+---------------------+
| id  | city   | st | type | num | val | startdate  | status    | comments | updated             |
+-----+--------+----+------+-----+-----+------------+-----------+----------+---------------------+
| 124 | Encino | CA | AAA  | 7   |   1 | 1993-09-01 | allocated |          | 2014-02-26 08:16:07 |
+-----+--------+----+------+-----+-----+------------+-----------+----------+---------------------+

依此类推。将此表中的"num"字段想象为公司ID。

"info"表包含有关某些公司的信息,并使用该公司id作为唯一标识符。并非所有在"记录"中列出的公司都将在"信息"中。"信息"表示例:

mysql> SELECT * FROM info LIMIT 2;
+-----+-------+--------------------------+---------------------+
| org | name  | description              | updated             |
+-----+-------+--------------------------+---------------------+
|   0 | ACME  |                          | 2014-02-19 10:35:39 |
|   1 | AT&T  | Some Phone Company, Inc. | 2014-02-18 15:29:50 |
+-----+-------+--------------------------+---------------------+

因此,这里的"org"将与第一个表中的"num"匹配。

我希望能够运行一个查询,在一行中返回除第一个表中的"id"、"type"one_answers"val"之外的所有内容,如果适用,还可以返回第二个表的"name"one_answers"description"。

我可以使用这个查询实现我想要的:

SELECT city,st,num,startdate,status,comments,updated, 
( SELECT name FROM info WHERE org = '7') AS name, 
( SELECT description FROM info WHERE org = '7') AS description 
FROM records WHERE num = '7'

但我看到它至少有两个问题:

  1. 运行两个子查询似乎效率低下
  2. 当"信息"中没有记录时,名称和描述我想打印一些字符串

为了解决第一个问题,我尝试返回一个数组。但是,当"信息"表中不存在相应的记录时,我什么也得不到,甚至连"记录"表中的有效信息都得不到。这是我的数组查询:

SELECT city,st,num,startdate,status,comments,updated,asinfo.name AS name,asinfo.description AS description 
FROM records, 
( SELECT name,description FROM info WHERE org = '7') AS asinfo 
WHERE num = '7'

如果两个表中都存在给定的公司id,则此查询可以正常工作。

为了解决第二个问题,我尝试了IFNULL和coalize的各种咒语,但都没有成功。

如果有任何见解,我将不胜感激。

谢谢。

应用LEFT JOIN语法:

SELECT 
r.city,
r.st,
r.num,
r.startdate,
r.status,
r.comments,
r.updated,
IF(d.name IS NULL, 'Default', d.name) AS name,
IF(d.description IS NULL, 'Default', d.description) AS description
FROM
records AS r
LEFT JOIN info AS d ON r.num=d.org
WHERE
r.num='7'

其工作方式如下:LEFT JOIN查找第一个表,如果第二个表中没有相应的记录,则应用NULL。所以您会发现使用IF(或IFNULL)并替换默认字符串。

info表中没有匹配行时,使用LEFT JOIN获取null值。

SELECT city,st,num,startdate,status,comments,updated,
IFNULL(name, 'Default Name') name, 
IFNULL(description, 'Default Description') description
FROM records r
LEFT JOIN info i ON r.num = i.org
WHERE r.num = 7

听起来从记录到信息的简单LEFT JOIN就可以了。

LEFT JOIN而不是JOIN,以确保始终从记录表中获取所有行,然后在信息表中获取相应的数据(如果该ID存在外部参照)。

无论是使用子查询还是使用联接,如果始终希望查看记录表中的所有行,则将始终获取与不存在外部参照的信息表相对应的NULL。避免这种情况的唯一方法是运行一些代码,调用记录中的所有内容,然后迭代结果以查询信息,有条件地添加到记录数据中。

相关内容

  • 没有找到相关文章

最新更新