0

これが私が理解できないものです。正常に動作するように 1 つの結合を取得できます。2 つ以上のテーブルを機能させる唯一の方法は、ループ内でネストされたクエリを使用することです。メインテーブルから複数のリストを取得せずに、複数の結合を使用して単一のクエリから結果を取得するにはどうすればよいですか?

3 つのテーブル: ユーザー: 2 ユーザー。プロジェクト: 2 つのプロジェクト。スキル: 6 スキル;

ここでは Codeigniter を使用するので、CI 構文を入れます。

$this->db->select('*');
    $this->db->from('projects');
    $this->db->join('user', 'user.id = projects.project_principal_id','left');
    $this->db->join('projects_skills_bridge', 'projects_skills_bridge.ps_project_id = projects.project_id','right');
    //$this->db->group_by('project_id'); // removed the multiple listing problem caused by the above JOIN
    $sql = $this->db->get();

これで、ループしてプロジェクトを取得すると (ユーザーとスキルの情報を含む)、2 つのプロジェクトしか取得できません。そのプロジェクトに関連付けられたスキルを取得する方法を理解できる唯一の方法は、ループ内でネストされたクエリを使用することです (上記の 2 番目の JOIN なし)。GROUP 句を使用すると、必要な 2 つのプロジェクトのみが取得されますが、必要な複数のプロジェクトではなく、最初のスキルのみが取得されます。

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

Project Alpha by User Bob - スキル: ギター、キーボード、ベース

ユーザー Sally によるプロジェクト ベータ - スキル: ライティング、html、請求

これは初歩的な問題だと思いますので、ご覧いただきありがとうございます。

4

1 に答える 1

0

あなたは次のようなものを持っているようです:

 -- user [id] is named [name]
users(id,name)
-- project [project_id] named [project_name] is by user [project_principal_id]
projects(project_id,project_name,project_principal_id)
-- project [ps_project_id] requires skill [skill]
projects_skills_bridge(ps_project_id,skill)

次の (project_name,name,skill) 行が必要になる場合があります。

THERE_EXISTS id, project_id, project_principal_id,ps_project_id
    user [id] is named [name]
AND project [project_id] named [project_name] is by user [project_principal_id]
AND project [ps_project_id] requires skill [skill]
AND id = project_principal_id
AND ps_project_id = project_id

その場合は、現在のクエリで'left'and'right'を変更するだけです。'inner'(なぜ and を使用'left'しているの'right'ですか?)

SELECT project_name, name, skill
FROM user
JOIN projects ON user.id = projects.project_principal_id
JOIN projects_skill_bridge ON projects_skills_bridge.ps_project_id = projects.project_id

代わりに、(おそらく単一の) プリンシパルとそのすべてのスキルの文字列を含むプロジェクトごとの行が必要な場合は、(内部) 結合をグループ化して、project_id ごとにスキルごとに 1 つの行があり、project_name、name、および GROUP_CONCAT(skill )。

SELECT project_name, name, GROUP_CONCAT(skill) AS skills
FROM user
JOIN projects ON user.id = projects.project_principal_id
JOIN projects_skill_bridge ON projects_skills_bridge.ps_project_id = projects.project_id
GROUP BY id, project_id

選択された GROUP BY 列により、id と project_id がベース テーブルのキーであると仮定すると、project_id ごとにスキルごとに 1 つの行しかないことが保証されます。

于 2014-09-02T05:59:57.763 に答える