提问人:gjvignesh 提问时间:8/23/2023 最后编辑:RiggsFollygjvignesh 更新时间:8/25/2023 访问量:32
单个 Mysql 查询显示多个列 NULL(如果这些值在另一个表中不存在)
Single Mysql query to display multiple columns NULL if those values not present in another table
问:
我有两个表说,并由公共列连接。PROJECT
POST_PROJECT
PID
PROJECT(PID,HOSTNAME,STATUS)
POST_PROJECT(PID,HOSTNAME,POST_STATUS)
在某些情况下,表中的主机名记录在表中不存在,如下所示,PROJECT
POST_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
答:
0赞
Jon White
8/24/2023
#1
正如评论中提到的,您需要一个LEFT JOIN
左联接采用第一个表(在联接的左侧)中的所有记录,并联接右表中的任何匹配记录。
your 和 columns 实质上构成了您的键,因此您需要将它们都包含在联接条件中。PID
HOSTNAME
此外,请确保列选择具有正确列名称的所需数据。表的主机名需要别名才能获得所需的结果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明白我要去哪里
评论
LEFT JOIN
IFNULL()
NULL