MySQL:左连接排除

时间:2015-03-28 20:39:30

标签: mysql sql left-join innodb

我正在努力处理MySQL请求,我似乎无法找到正确的语法。 我的数据库的设计非常简单:我有一个表申请人,一个表实习和一个表应用程序。当申请人申请实习时,我会在申请表中插入一行,其中包含两个连接申请人和实习的外键。

问题:如何知道申请人的身份证明,我如何获得申请人尚未申请的所有实习名单?

SO FAR :我提出了这个问题,但事实并非如此:

SELECT internship.* FROM internship LEFT JOIN application
ON application.id_internship = internship.id_internship
WHERE application.id_applicant IS NULL OR application.id_applicant <> 42
GROUP BY application.id_internship

非常感谢任何帮助。祝你有个美好的一天。

database design

2 个答案:

答案 0 :(得分:1)

您可以使用EXISTS运算符在没有连接的情况下执行此操作,如下所示:

SELECT *
FROM internship i
WHERE NOT EXISTS (
    SELECT *
    FROM application a
    WHERE i.id_internship = i.id_internship AND application.id_applicant = 42
)

该查询不言自明:只会选择id 42 {{1}}申请人不适用的实习机会。

答案 1 :(得分:1)

您应该在联接中使用申请人ID的条件并使用=运算符,以便连接的记录是与申请人相关的记录,然后筛选出联接匹配的实习:

SELECT
  internship.*
FROM
  internship
  LEFT JOIN application ON application.id_internship = internship.id_internship AND application.id_applicant = 42
WHERE
  application.id_applicant IS NULL

无需对查询进行分组,因为每次实习仅在结果中出现一次。