2

次のような構造のデータベースがあります (わかりやすくするために簡略化しています)。

ユーザー

  • ID
  • 名前

仕事

  • ID
  • 名前
  • グループ

task_link

  • ユーザー
  • 仕事

私が試みているクエリは、基本的に、「このグループの一部であるすべてのタスクと、そのタスクに割り当てられているすべてのユーザーを取得する」です。

このプロジェクトのいくつかの場所で JOIN クエリを使用しましたが、それらの理解は基本的なものであり、残念ながらこれは他のシナリオとは異なります。JOIN クエリでの私の試みは、ほとんど機能しているようです (CI データベース クラスの書式設定ですが、うまくいけば、何が起こっているのかは明らかです):

$this->db->select('task.name AS taskname, user.name AS username');
$this->db->from('task');
$this->db->from('task_link');
$this->db->where('task.group', $group);
$this->db->join('user', 'user.id = task_link.user');

編集:明確にするために適切なクエリとしてダンプされます:

SELECT `user`.`name` AS username, `task`.`name` AS taskname FROM (`task`, `task_link`) JOIN `user` ON `user`.`id` = `task_link`.`user` WHERE `task`.`group` = '7'"

task 、 task_link 、および user のほぼすべての組み合わせで上記を試しましたが、毎回同じ結果になります。主な問題は次のとおりです。

  • 重複した結果が得られ、それらの数が奇数です。グループ化が何であるかを完全に理解できません。現在、「リンク」の数である各タスクに対して 6 つの結果が得られているようです。
  • ユーザーがタスクに「結び付く」方法は正しくありません。タスクの一部としてユーザーを配列として返す必要があります (各タスクには複数のユーザーがリンクされている可能性があるため)。一方、結果には1人のユーザーと複数の結果しかないようです(ただし、各ユーザーのタスクではありません)。

私のモデルを理解するのに役立つ場合、ビューは次のようになります。

foreach($tasks as $task){
  echo $task->taskname;
  foreach($task->username as $user){
    echo $user;
  }
}

さまざまな JOIN 句があり、おそらくより関連性の高いグループ化コマンドがあることは知っていますが、頭が痛くなり始めており、mysql スキルの限界に直面していると思います。

上記のクエリを説明どおりに機能させるために手を貸すことができる人はいますか? 何か有用なものを省略した場合はお知らせください。

4

1 に答える 1

1

task_link と task がどのように関連しているかは推測していますが、必要な基本的な SQL は次のとおりだと思います。

SELECT user.name AS username, task.name AS taskname
FROM task
INNER JOIN task_link ON task.id = task_link.task
INNER JOIN user ON user.id = task_link.user
WHERE task.group = '7'"

私はこれに翻訳すると思います:

$this->db->select('task.name AS taskname, user.name AS username');
$this->db->from('task');
$this->db->where('task.group', $group);
$this->db->join('task_link', 'task.id = task_link.task');
$this->db->join('user', 'user.id = task_link.user');
于 2013-10-29T16:35:42.623 に答える