通过多个JOIN检查整个数组

时间:2012-01-03 12:52:27

标签: mysql sql ruby-on-rails database


要从单个表中过滤所选条目的表输出,我需要通过几个表来执行多个JOIN请求 我想通过表格中的特殊列过滤人员表。让我们说这个专栏是“任务”。现在任务也是另一个带有“people”列的表,这两个表之间的值与数据库中一个存在的“join”表连接,该表将一个表的几个ID与另一个表的每个ID相匹配。 /> 现在,如果这很简单,我可以使用INNER JOIN和特殊条件进行过滤。问题是,表“tasks”的条目通过数据库中的“join”表连接到另一个表。为了简化事情,我们可以说它是“设置”。因此,每个“任务”都包含几个“设置”,这些“设置”通过其ID中的连接表进行连接。

那么输入是什么?
我有一个ID数组,它们代表我不想显示的设置ID。

输出应该是什么?
正如已经说过的那样,我希望过滤器输出为“people”,而过滤器则是“设置”。 我希望sql请求返回表“people”的每个条目,只有连接的任务没有加入数组中的任何“setting-id”。

我希望你能帮助我。

提前致谢!

示例

  

设置-表:
  1.正在进行中   2.重要的是   3.有未解决的问题

     

任务 - 表:( settings.tasks是许多任务与许多设置之间的连接表)
  1. 2012年1月1日起的任务 - 加入1和3中的设置(进行中+未解决的问题)
  2. 2012年1月2日的任务 - 加入2中的设置(很重要)
  3. 2012年1月3日的任务 - 加入1和2中的设置(...)

     

人 - 表:( people.tasks是许多人与许多任务之间的联接表)
  1.盖伊 - 加入1,2,3中的任务(已分配给所有3个任务)
  2. Dude - JOINS任务1(已于2012年1月1日起分配给任务)
  3.女孩 - 在2,3(......)

中加入任务      

现在有一个数组传递给sql查询
  [2,3]应该返回任何人,因为每个人都被分配到一个重要或未解决问题的任务中!   [3]只返回“女孩”这个人,因为它是唯一一个分配给任务(2和3)没有未解决问题的人。

我希望现在很清楚。 :)

2 个答案:

答案 0 :(得分:2)

SELECT DISTINCT PEOPLE.* 
FROM PEOPLE INNER JOIN PEOPLE_TASKS ON PEOPLE.PERSON_ID = PEOPLE_TASKS.PERSON_ID
WHERE TASK_ID NOT IN (SELECT DISTINCT TASK_ID
                      FROM TASK_SETTINGS
                      WHERE SETTING_ID = <Id you don't want>)

编辑(用于提供您不想要的多个设置ID)

SELECT DISTINCT PEOPLE.* 
FROM PEOPLE INNER JOIN PEOPLE_TASKS ON PEOPLE.PERSON_ID = PEOPLE_TASKS.PERSON_ID
WHERE TASK_ID NOT IN (SELECT DISTINCT TASK_ID
                      FROM TASK_SETTINGS
                      WHERE SETTING_ID IN (<Id you don't want>))

答案 1 :(得分:0)

首先,您必须使用join table people table tasksjoin table,我们称之为people_tasks

select distinct p.* from people p
inner join people_tasks pt on p.people_id = pt.people_id
inner join tasks on t.tasks_id = pt.tasks_id

然后您必须使用join table tasks table settingsjoin table,我们称之为tasks_settings。您必须在当前joinselect

select distinct p.* from people p
inner join people_tasks pt on p.people_id = pt.people_id
inner join tasks on t.tasks_id = pt.tasks_id
inner join tasks_settings ts on t.tasks_id = ts.tasks_id
inner join settings s on s.settings_id = ts.settings_id

现在您已将所有people与其tasks及其settings相关联。最后你需要restriction。选择设置的人员,您可以选择其他人:

select distinct p.people_id from people p
inner join people_tasks pt on p.people_id = pt.people_id
where p.people_id not in (
    select distinct p2.people_id from people p2
    inner join people_tasks pt2 on p2.people_id = pt2.people_id
    inner join tasks t2 on t2.tasks_id = pt2.tasks_id
    inner join tasks_settings ts2 on t2.tasks_id = ts2.tasks_id
    inner join settings s2 on s2.settings_id = ts2.settings_id
    where s2.settings_id in (list of ids)
)