从表中选择id不在另一个表中

时间:2016-05-22 16:07:24

标签: mysql sql

我想选择所有不属于某个公司的飞机。在这种情况下,我有三个表:PlanesCompaniesCompanyPlanes

这是我的问题:

SELECT *
FROM planes p,
     companyplanes cp,
     companies c
WHERE c.id = ?
  AND cp.idCompany != c.id
  AND (cp.idPlane = p.id OR p.id NOT IN (SELECT idPlane FROM companyplanes)) 
ORDER BY name ASC

但是这个查询什么都没有回复!这有什么不对?

示例:

| Plane |
---------
id | name
---------
1  | p1
2  | p2
3  | p3


|Company|
---------
id | name
---------
1  | c1
2  | c2

|     companyPlanes    |
------------------------
id | idCompany | idPlane
------------------------
1  |      1    |    1
2  |      1    |    2
3  |      2    |    2

如果我想获得不属于公司c2的飞机,结果应为:p1,p3。

3 个答案:

答案 0 :(得分:1)

更新答案

我们可以按照以下方式获得结果

  1. 获取意外公司的所有飞机

    SELECT idplane from CompanyPlanes WHERE idCompany = ?

  2. 在没有意外公司的飞机的情况下获取所有飞机

    SELECT * FROM Planes WHERE id NOT IN ( SELECT idplane from CompanyPlanes WHERE idCompany = ? )

  3. 由于您已从join表中获得Company,因此您无需idCompany CompanyPlanes表。

答案 1 :(得分:0)

内连接要求查询从公司平面中具有相应行的平面返回行,但子选择将排除在公司平面中具有相应记录的任何行。

假设您想要公司平面上没有记录的飞机记录,那么您为什么还要从公司中选择?

Select p.*
From planes p
Left join
  Companyplanes do
On p.id=cp.idplane
Where cp.idplane is null;

答案 2 :(得分:0)

如果我以正确的方式理解你的问题,这就是你可能正在寻找的......

select p.*
from planes p 
     join companyplanes cp on cp.idPlane=p.id
     join companies c on c.id=cp.idCompany
where c.id != ?