要从单个表中过滤所选条目的表输出,我需要通过几个表来执行多个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)没有未解决问题的人。
我希望现在很清楚。 :)
答案 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 tasks
和join 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 settings
和join table
,我们称之为tasks_settings
。您必须在当前join
中select
。
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)
)