单个 Mysql 查询显示多个列 NULL(如果这些值在另一个表中不存在)

Single Mysql query to display multiple columns NULL if those values not present in another table

提问人:gjvignesh 提问时间:8/23/2023 最后编辑:RiggsFollygjvignesh 更新时间:8/25/2023 访问量:32

问:

我有两个表说,并由公共列连接。PROJECTPOST_PROJECTPID

PROJECT(PID,HOSTNAME,STATUS)
POST_PROJECT(PID,HOSTNAME,POST_STATUS)

在某些情况下,表中的主机名记录在表中不存在,如下所示,PROJECTPOST_PROJECT

项目:

(1,'HOST1','SUCCESS'),(1,'HOST2','FAIL')

PID, HOSTNAME, STATUS
1    HOST1     SUCCESS
1    HOST2     FAIL

POST_PROJECT:
(1,'HOST1','FAIL')

PID, HOSTNAME, POST_STATUS
1    HOST1     FAIL

在这种情况下,我需要一个查询,如果表中不存在主机名,我必须显示两个表的所有列,值POST_PROJECT NULL 如下所示,

(1,'HOST1','SUCCESS',1,'HOST1','FAIL')
(1,'HOST2','FAIL',1,NULL,NULL)

PID, HOSTNAME, STATUS, POST HOSTNAME, POST_STATUS
1    HOST1     SUCCESS HOST1          FAIL
1    HOST2     FAIL    NULL           NULL

预期成果:

PID,PROJECT_HOSTNAME,PROJECT_STATUS,PID,POST_PROJECT_HOSTNAME,POST_PROJECT_STATUS
(1,'HOST1','SUCCESS',1,'HOST1','FAIL')
(1,'HOST2','FAIL',1,NULL,NULL)

PID, HOSTNAME, STATUS, POST HOSTNAME, POST_STATUS
1    HOST1     SUCCESS HOST1          FAIL
1    HOST2     FAIL    NULL           NULL

实际结果:

PID,PROJECT_HOSTNAME,PROJECT_STATUS,PID,POST_PROJECT_HOSTNAME,POST_PROJECT_STATUS
(1,'HOST1','SUCCESS',1,'HOST1','FAIL')
(1,'HOST2','FAIL',1,'HOST1','FAIL')

PID, HOSTNAME, STATUS, POST HOSTNAME, POST_STATUS
1    HOST1     SUCCESS HOST1          FAIL
1    HOST2     FAIL    HOST1          FAIL
sql mysql null mariadb ifnull

评论

2赞 CHill60 8/23/2023
共享用于获取实际结果的代码
1赞 Barmar 8/24/2023
这就是作用。LEFT JOIN
0赞 Barmar 8/24/2023
如果要获取实际的 null 值,则不应使用。这用于替换为默认值。IFNULL()NULL

答:

0赞 Jon White 8/24/2023 #1

正如评论中提到的,您需要一个LEFT JOIN

左联接采用第一个表(在联接的左侧)中的所有记录,并联接右表中的任何匹配记录。

your 和 columns 实质上构成了您的键,因此您需要将它们都包含在联接条件中。PIDHOSTNAME

此外,请确保列选择具有正确列名称的所需数据。表的主机名需要别名才能获得所需的结果post_project

SELECT project.pid,
    project.hostname,
    project.status,
    post_project.hostname as post_hostname,
    post_project.post_status
FROM project
LEFT JOIN post_project
    ON project.pid = post_project.pid
    AND project.hostname = post_project.hostname

评论

0赞 gjvignesh 8/24/2023
谢谢乔恩,我犯了一个愚蠢的错误,除了 pid 之外没有加入主机名,而是在 where 子句中使用。所以我没有得到预期的结果。无论如何,非常感谢。这行得通。
0赞 Jon White 8/24/2023
@gjvignesh 我很高兴我能帮上忙。另一位用户在评论中提到,分享您尝试的查询将帮助我们了解您出错的地方,有人会立即在这里发现该错误。太好了,现在一切都在工作
0赞 slaakso 8/25/2023
@JonWhite。查询中缺少 -子句FROM
0赞 Jon White 8/25/2023
@slaakso,你是对的。已编辑修复。幸运的是,OP明白我要去哪里