2013-03-31 68 views
0

我有一个人表和一个任务表。虽然一个任务可以由多人完成,所以在两者之间有一个“花名册”表:获取加入者的活动任务

person 
task_roster 
task 

我在寻找返回每个人和他们的当前活动任务的查询。如果他们没有活动的任务,它应该简单地返回NULL。我一直在瞎搞如下:

SELECT * 
FROM person 
LEFT OUTER JOIN task_roster ON (task_roster.person = person.id) 
LEFT OUTER JOIN task on (task.id = task_roster.task AND task.status = 1) 
ORDER BY person.name 

我在运行过的问题是,该查询返回旧名册条目,所以我多次得到相同的人回来了,因为他们执行的每一先前任务。我也试过在person.name上添加Group By,但是我没有得到任何活动职责,只是NULL值。

我在寻找的restult会是这样的:

+----------------+-----------+----------------+ 
| person.name | task.id | task.name  | 
+----------------+-----------+----------------+ 
| David Harris | 5   | Maintenance | 
| Karen Simmons | 2   | Transport  | 
| Linda Foster | 5   | Maintenance | 
| Michael King | NULL  | NULL   | 
+----------------+-----------+----------------+ 

大卫和琳达都从事相同的任务。名册表无非是当时我不知道这会工作person.id和task.id

+1

你能给出你想要的结果的样本记录吗? –

+0

更新了我的文章。 – Zedicius

+0

我们需要更多信息:示例数据,表格defs和当前(错误)输出..足以启动小提琴。 – ethrbunny

回答

0

为什么你还得到旧任务的原因是因为此联合声明:

... 
task_roster ON (task_roster.person = person.id) 
LEFT OUTER JOIN task 
... 

基本上它显示表task_roster的所有记录。这可能有其他解决方案,但我的解决方案下面使用只有person具有特定活动任务的子查询。子查询的结果然后使用LEFT JOIN加入表person,因此表person上的每个记录都将显示在列表上,无论它是否具有子查询上的匹配记录或无。

SELECT a.name AS PersonName, 
     b.task AS TaskID, 
     b.name AS TaskName 
FROM person a 
     LEFT JOIN 
     (
      SELECT a.person, a.task, b.name 
      FROM task_roster a 
        INNER JOIN task b 
         ON a.task = b.id 
      WHERE b.status = 1 
     ) b ON a.id = b.person 
1

之间的联系:

SELECT person.*,task.status 
FROM person 
LEFT OUTER JOIN task_roster ON (task_roster.person = person.id) 
LEFT OUTER JOIN task on task.id = task_roster.task 
WHERE task.status=1 
ORDER BY person.name