MySQL列出一个表中的所有行,不包括已被另一个表引用的行

时间:2014-09-02 07:40:44

标签: mysql sql database

我花了一些时间撕掉我的头发并梳理互联网寻求帮助,但我没有太多运气。我觉得我错过了一些显而易见的事情,我感到很累,也很生气lol

我有两张桌子。一个叫做RolesAndServices,一个叫做Roles。它们看起来像这样。

Roles
- ID
- Name

RolesAndServices
- ID
- JobID
- RoleID
- ClientID
- PeopleID

我想要达到的目标是:

SELECT Roles.ID, Roles.Name FROM Roles, RolesAndServices WHERE
RolesAndServices.RoleID = Roles.ID AND NOT RolesAndServices.JobID = 1

不起作用的原因是因为RolesAndServices(当前)中的所有项目都具有JobID 1.足够公平。所以我明白为什么那不起作用。

我想要实现的是角色中所有项目的列表,排除这些角色

  1. 出现在RolesAndServices表和
  2. 拥有一个设为1的JobID
  3. 基本上,最终目标是创建一个HTML选择,该选择将包含除已为该作业设置的角色之外的每个角色的选项。

    例如,总共有三个角色:

    1. 教师
    2. 学生
    3. 如果某个职位已经添加了教师角色,则RolesAndServices会有一个条目,其中包含教师的角色和相关职位的jobid。向该作业添加其他角色时,可用选项应为

      1. 学生
      2. 我尝试了各种基于连接的查询,但无济于事。选择所有角色然后排除那些已在角色和服务中使用的角色是可以实现的,我只是在将排除限制为特定的工作号时偶然发现。

        提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用NOT EXISTS

SELECT  ID, Name
FROM    Roles ro
WHERE   NOT EXISTS
        (
            SELECT  NULL
            FROM    RolesAndServices rs
            WHERE   ro.ID = rs.RoleID
                    AND rs.JobID = 1
        )