我有以下表格:
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)
而不是应该具有空值的住宿
我在这里做错了什么?
将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行.