首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL连接以查看其他表中是否存在记录

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

Stack Overflow用户
提问于 2013-01-10 17:36:04
回答 5查看 6.9K关注 0票数 5

我有以下表格:

代码语言:javascript
复制
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。

我希望有一个结果集来显示以下内容:

代码语言:javascript
复制
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

我现在的查询是这样的:

代码语言:javascript
复制
SELECT *
FROM accommodations a
LEFT JOIN accommodations_exclude ae ON a.id = ae.id_accommodation 
WHERE ae.id_course = 16

但是这只给出了结果集。

代码语言:javascript
复制
2,'acco 2',2,16

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

你知道我做错了什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-10 17:39:03

ae.id_course = 16子句从WHERE移动到您的LEFT JOIN

代码语言:javascript
复制
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行。

票数 9
EN

Stack Overflow用户

发布于 2013-01-10 17:39:16

accommodations_exclude表设为左表,或者使用RIGHT JOIN,如下所示:

代码语言:javascript
复制
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

这将为您提供:

代码语言:javascript
复制
| 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

票数 1
EN

Stack Overflow用户

发布于 2013-01-10 17:38:46

它不会根据你的情况给你更多的东西。

代码语言:javascript
复制
WHERE ae.id_course = 16

它为您提供了适当的结果集。删除它,它将列出所有这些内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14254663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档