0

現在、テーブルからすべての行と選択した行を取得しようとしているときに問題があります。

したがって、users、tasks、および tasks_users という結合テーブルの 3 つのテーブルがあります。

後者のテーブルには、正規化のために、task_id と user_id の 2 つの列だけが含まれています。

タスクを編集するフォームがあります。この問題は、すべてのユーザーを取得して (タスクを再割り当てできるように)、現在のユーザーも表示したい場合に発生します。現在のクエリを考えると、すべてのユーザーまたは単一の関連ユーザーのみを取得できます。

明らかなことを見落としていますか、それとももっと複雑なクエリが必要ですか? それともいくつかのクエリですか?

さらなる解明:

「タスクの編集」フォームがあり、その上に現在ユーザーが割り当てられているとします。再割り当てできるように、他のすべてのユーザーも表示したいと思います。3 つのテーブルがあることを考えると、必要なものを返すクエリを作成するのに苦労しています。現在、すべてのユーザーまたは割り当てられた単一のユーザーのみを返すことができます。

4

4 に答える 4

2

現在のユーザーではなく、タスクの担当者のようです。誰がタスクを割り当てても、そのタスクを現在の担当者に割り当てることはできません。

特定のタスクに 1 人のユーザーしか割り当てることができない場合は、テーブルを削除できます。これは、テーブルにtask_users列を追加するだけで同じ仕事ができるからです。user_idtasks

あなたがテーブルにいるとしましょうusers

id   |   username   |
---------------------
 1   |     A        |
 2   |     B        |
 3   |     C        |
 4   |     X        |
 5   |     Y        |

そして表にtasks

id   |     title    |   user_id   |
-----------------------------------
 1   |      Bla     |      3      |
 2   |      Asd     |    NULL     |  // if this is even possible

task_id = 1 (Bla) に割り当てることができる人を取得したい場合は、次のように簡単に実行できます。

$currentTaskID = 1; // or however you retrieve them, it's just for the explanation purpose
SELECT id, username FROM users WHERE id != (SELECT user_id FROM tasks WHERE id = $currentTaskID);

出力は次のようになります。

id   |   username   |
---------------------
 1   |     A        |
 2   |     B        |
 4   |     X        |
 5   |     Y        |

タスクを複数のユーザーに割り当てることができ、task_usersテーブルを保持する場合、そこにあると想像できます。

task_id   |   user_id   |
-------------------------
   1      |     3       |
   2      |    NULL     |
   1      |     5       |

次の方法でクエリを実行できます。

$currentTaskID = 1; // or however you retrieve them, it's just for the explanation purpose
SELECT id, username FROM users WHERE id NOT IN (SELECT user_id FROM task_users WHERE task_id = $currentTaskID);

したがって、出力は次のようになります。

id   |   username   |
---------------------
 1   |     A        |
 2   |     B        |
 4   |     X        |

担当者で NULL 値を許可して、タスクが誰にも割り当てられないようにすると、WHERE id != NULLNULL ID がないため、SELECT はすべてのユーザーを返します。users

現在のユーザーをどこかに表示するために、割り当てには使用できないため、関数/メソッドでクエリを分離する必要があります。

あなたが持っていると言って:

function getAvailableAssignees($task_id) {
     $sql = "SELECT id, username FROM users WHERE id != (SELECT user_id FROM tasks WHERE id = $task_id);";
     $this->query($sql);
     return $this->result();
}

function getCurrentAssignee($task_id) {
     $sql = "SELECT user_id FROM tasks where id = $task_id;";
     $this->query($sql);
     return $this->result();
}

したがって、利用可能な担当者を表示する必要がある場合は、それぞれのメソッドを呼び出します。現在の担当者を表示する必要がある場合も同様です。

于 2013-09-17T19:11:31.673 に答える