我有以下表格:
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`)
) 在住宿表格中有4条记录,在accommodations_exclude中有更多记录。现在,我希望有一个查询,该查询始终提供accommodations表中的所有记录,并将其作为额外字段连接起来,以查看accommodations_exclude表中是否也存在。
例如,在accommodations_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我现在的查询是这样的:
SELECT *
FROM accommodations a
LEFT JOIN accommodations_exclude ae ON a.id = ae.id_accommodation
WHERE ae.id_course = 16但是这只给出了结果集。
2,'acco 2',2,16而不是应该具有空值的住宿
你知道我做错了什么吗?
发布于 2013-01-10 17:39:03
将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你应该把WHERE看作是对最终结果集的过滤,任何与链接表相关的事情都应该是你的JOIN中的条件。
原始的WHERE ae.id_course = 16从结果集中过滤掉了空的ae.id_course行。
发布于 2013-01-10 17:39:16
将accommodations_exclude表设为左表,或者使用RIGHT JOIN,如下所示:
SELECT
a.id,
a.name,
ae.id_accommodation,
ae.id_course
FROM accommodations a
RIGHT JOIN accommodations_exclude ae ON a.id = ae.id_accommodation;SQL Fiddle Demo
这将为您提供:
| ID | NAME | ID_ACCOMMODATION | ID_COURSE |
----------------------------------------------
| 1 | acco 1 | (null) | (null) |
| 2 | acco 2 | 2 | 16 |
| 3 | acco 3 | (null) | (null) |
| 4 | acco 4 | (null) | (null) |请注意:对于您发布的示例数据,WHERE ae.id_course = 16将只返回一行,该行包含ae.id_course = 16。
发布于 2013-01-10 17:38:46
它不会根据你的情况给你更多的东西。
WHERE ae.id_course = 16它为您提供了适当的结果集。删除它,它将列出所有这些内容。
https://stackoverflow.com/questions/14254663
复制相似问题