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           |
 +----------------+-----------+----------------+

David と Linda は同じタスクに取り組んでいます。名簿テーブルは、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

古いタスクも取得する理由は、次の結合ステートメントのためです。

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

基本的に、 table のすべてのレコードが表示されます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
于 2013-03-31T12:39:50.877 に答える