获取具有连接的人的活动任务

时间:2013-03-31 11:16:35

标签: mysql sql select

我有一个人员表和一张任务表。虽然任务可以由多人完成,但两者之间有一个“名册”表:

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之间的链接

2 个答案:

答案 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