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 值。

我正在寻找的结果是这样的:

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

4

2 回答 2

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
于 2013-03-31T12:31:02.053 回答
0

您还获得旧任务的原因是因为这个 join 语句:

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

基本上它显示表中的所有记录task_roster。可能还有其他解决方案,但我下面的解决方案使用仅person与特定活动任务有关的子查询。然后将子查询的结果连接回表personusingLEFT 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
于 2013-03-31T12:39:50.877 回答