2010-12-30 5 views
0

私は、ユーザーが一連の "実行"の一部であり、各 "実行"にコース、教師(ユーザー)、クラスなどを追加できるシステムを持っていますに。MySQLのいくつかの要因に基づいて特定のデータを取得する際の問題

各教師(ユーザ)が自分のクラスを選択しました&コース。 は、ここに関連している私が持っているテーブルのランダウンです:私は何をしたいか

lam_run - The run in it self. 
lam_run_course - Relational table that shows what runs has what courses 
lam_teacher_course - Relational table that shows which teacher has which courses 
lam_run_teacher - Relational table that shows what teachers are in what courses 

は(彼らはlam_teacher_courseで見選択しているコースに基づいて)それらに関連していること実行する各教師を示しています彼らはすでに参加していない。ここで

は、私が持っているMySQLのコードが動作しないという、これまでです:

$query_relevant_runs = " 
SELECT DISTINCT 
    lam_run_course.run_id 
FROM 
    lam_teacher_course, 
    lam_run_course, 
    lam_run, lam_run_teacher 
WHERE 
    lam_teacher_course.user_id = '1' 
AND 
    lam_teacher_course.course_id = lam_run_course.course_id 
AND 
    lam_run_teacher.user_id != '1'"; 

代わりに、このコードは、関連するすべての実行を示しているが、それはユーザがすでにあるの実行を排除するものではない。..

これを解決するにはどうすればよいですか?

ps。悪いタイトルのために申し訳ありませんが、私はそれと呼ばれるべきだったものを何もアイデア:ここでS

は、データベース(関連部分)の一部にリンクされていない:Link!

+0

I JOINに何か問題があると思うのを助けることはできません... "lam_teacher_course.course_id = lam_run_course.course_id" しかし、私たちはテーブルを持っていないので、それが何であるか本当に難しいです。 –

+0

関連するテーブルのphpmyadminからdbダンプを追加しましたか? :) – Eax

+0

それを打つ - 少なくとも私たちはそれをデバッグしようとすることができます。しかし、クエリが良いように見える...私は構文エラーが表示されないので、それは論理になるはずです。 –

答えて

1

私はあなたが探しているものだと思うされています。

LEFT JOIN `lam_run_teacher` `lam_run_teach_exclude` 
ON `lam_run_teacher_exclude`.`user_id` = `lam_teacher_user`.`user_id` 
... 
WHERE `lam_run_teacher`.`user_id` IS NULL 

LEFT JOINは、現在のクエリを取得し、追加データを追加します。しかし、あなたが今使用しているINNER JOINとは異なり、LEFT JOINは結果セットを右辺のデータがあるものだけに限定しません(ちょっと変わったmultiple-from構文を使用しています)。右側の列はNULLになります。そのNULLをフィルタリングすることで、面白いすべてのランを見つけることができます。そのためには、まだ教師との関係はありません。

これは役に立ちますか?

通常の結合構文(INNER JOIN target on target.id = source.id)を使用することをお勧めします。他の種類の結合もあり、すべての結合が同じに見えるというアイデアが気づきます。それに慣れていますが、クエリがより複雑になるときは間違いなく役立ちます。

また、相互参照表では、主キー列を削除できます。テーブルの唯一の目的が2つのテーブル間のリンクを定義することである場合、プライマリキーを2つのキーで構成します。あなたは...


OK実行するために複数回、同じ先生に関連することができるようにしたい場合を除き、道長いそれは持つべきであるよりも連れて行ってくれたが、ここでは完全なものがあります:

 
SELECT 
    DISTINCT `lam_run_course`.run_id 
FROM 
    `lam_run_course` 
INNER JOIN 
    `lam_teacher_course` 
    ON `lam_teacher_course`.course_id = `lam_teacher_course`.course_id 
LEFT JOIN 
    `lam_run_teacher` ON (`lam_run_teacher`.`run_id` = `lam_run_course`.`run_id` AND `lam_run_teacher`.`user_id` = 3) 
WHERE 
    `lam_teacher_course`.user_id = 3 
    and `lam_run_teacher`.`run_id` IS NULL 
+0

実際には、私はそれを本当に理解していません:Sそれは私の現在のクエリを取るように見えない? lam_run_teach_excludeとは何ですか? – Eax

+0

こんにちはEax - すみません。 lam_run_teacher_excludeはエイリアスです。テーブルに2回参加するので、2つのジョインのうちの1つをエイリアスする必要があります。そうしないと、MySQLはどのテーブルが有効かわかりません。私は挿入するスニペットの代わりにあなたの全体のクエリを含めるように私の答えを更新します、私に数分を与える:) – kander

+0

ありがとう! :)私は説明を得るよりも多くの事例を覚えています:) – Eax

関連する問題