MySQL连接以查看其他表中是否存在记录

Dan*_*obo 5 mysql

我有以下表格:

CREATE TABLE `accommodations` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) 

CREATE TABLE `accommodations_exclude` (
  `id_accommodation` int(11) unsigned NOT NULL,
  `id_course` int(11) NOT NULL,
  UNIQUE KEY `id_course` (`id_course`,`id_accommodation`)
) 
Run Code Online (Sandbox Code Playgroud)

在住宿表中有4条记录,在accommodation_exclude中还有更多.现在我希望有一个查询总是从住宿表中给我所有记录,并作为额外字段加入,以查看住宿是否也存在于accommodation_exclude表中.

例如; 在accommodation_exclude中有一行id_accommodation = 2,id_course = 16.

我想要一个结果集向我显示以下内容:

accommodation.id, accommodation.name, accommodation_exclude.id_accommodation, accommodation_exclude.id_course

1,'acco 1',null,null
2,'acco 2',2,16
3,'acco 3',null,null
4,'acco 4',null,null
Run Code Online (Sandbox Code Playgroud)

我现在的查询是这样的:

SELECT *
FROM accommodations a
LEFT JOIN accommodations_exclude ae ON a.id = ae.id_accommodation 
WHERE ae.id_course = 16
Run Code Online (Sandbox Code Playgroud)

但这只给了我结果集

2,'acco 2',2,16
Run Code Online (Sandbox Code Playgroud)

而不是应该具有空值的住宿

我在这里做错了什么?

Ros*_*Nab 8

ae.id_course = 16条款WHERE移到您的LEFT JOIN

SELECT *
FROM accommodations a
LEFT JOIN accommodations_exclude ae ON
    a.id = ae.id_accommodation
    AND ae.id_course = 16
Run Code Online (Sandbox Code Playgroud)

您应该将其 WHERE视为最终结果集的过滤器,与链接表有关的任何内容都应该是您JOIN的条件.

您的原始文件WHERE ae.id_course = 16正在过滤掉结果集中的NULL ae.id_course行.