我有一个人员表和一张任务表。虽然任务可以由多人完成,但两者之间有一个“名册”表:
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值。
我正在寻找的结果将是这样的:
+----------------+-----------+----------------+
| 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之间的链接
答案 0 :(得分: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
答案 1 :(得分:0)
你还得到旧任务的原因是因为这个连接语句:
...
task_roster ON (task_roster.person = person.id)
LEFT OUTER JOIN task
...
基本上它显示表task_roster
中的所有记录。可能还有其他解决方案,但我的解决方案使用的子查询只能获得具有特定活动任务的person
。然后使用person
将子查询的结果连接回表LEFT JOIN
,因此表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