gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:08:58 27 4
gpt4 key购买 nike

我有两个表,“记录”和“信息”。

“记录”表如下所示:

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”和“val”之外的所有内容,如果适用,则返回第一个表中的“name”和“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. 当“info”中没有记录时,名称打印NULL,描述。我想打印一些字符串。

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

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和coalesce的咒语,但没有成功。

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

谢谢。

最佳答案

应用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)并替换默认字符串。

关于MySQL从子查询返回数组,以及NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22070190/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com