我有两个表,"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'
但我看到它至少有两个问题:
- 运行两个子查询似乎效率低下
- 当"信息"中没有记录时,名称和描述我想打印一些字符串
为了解决第一个问题,我尝试返回一个数组。但是,当"信息"表中不存在相应的记录时,我什么也得不到,甚至连"记录"表中的有效信息都得不到。这是我的数组查询:
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。避免这种情况的唯一方法是运行一些代码,调用记录中的所有内容,然后迭代结果以查询信息,有条件地添加到记录数据中。