2016-05-17 14 views
0

私は3つのテーブル、ユーザーテーブル、コーステーブル、および隠されたコーステーブルを持っています。3つのテーブルのMySQL複合結合

隠しコーステーブルには、user_idカラムとcourse_idカラムが含まれています。

「コース1」のすべてのユーザーのすべての隠しコースの表情報を確認したいとします。私は私のデータを取得すると、私はそれを含める:

  • がcourses.id hidden_​​courses.id
  • courses.title
  • user.id
  • user.name

私はこのクエリを実行するためにいくつかのことを試みてきましたが、必ずしもカラムを正しく埋めるとは限りません。コース情報は常に「コース1」からのものであり、すべてのユーザーのリストであることが必要です。存在しない可能性があるのはhidden_courses.idだけです。

SELECT hc.id, u.id, u.name, c.id, c.title 
FROM hidden_courses AS hc 
RIGHT JOIN users AS u ON u.id = hc.user_id 
RIGHT JOIN courses AS c ON c.id = hc.course_id 

私はLEFTを使用してクエリを実行する必要がありJOINS代わりに、ユーザーテーブルから選択します。ここでは

は私がしようとしていた何ですか?私もそれで成功しなかった。

コースとユーザーテーブルの間には関係がありません。私は3人のユーザーと、user1とcourse1のための1つの隠されたコース記録を持っていると言うことができます。私は出力になりたいでしょう:私は、一般的に理解しやすいようにLEFT JOINのを見つけ

enter image description here

+4

私は信じていますが、これは「複合体」とはみなされません。 :-) –

+0

'users'と' courses'の関係は何ですか? –

+1

テーブル構造、いくつかのサンプルデータ、そして期待される出力をサンプルデータとして与えると、それははるかに簡単に答えることができます。参照してください:http://stackoverflow.com/help/how-to-ask –

答えて

1

SELECT hc.id, u.id, u.name, c.id, c.title 
FROM courses as c -- must exist 
LEFT JOIN users as u on 1=1 -- all users, optional 
LEFT JOIN hidden_courses as hc on hc.user_id=u.id and hc.course_id=c.id -- optional 

ユーザーがいないと仮定すると、結果は表示されません。その場合は、LEFT JOIN usersJOIN usersに置き換えてください。その効果が得られます。

メインの部分だけをフィルタリングしますかcourses c?その場合は、1=1usersと対応するcoursesに結びつけるものに置き換えてください。

RIGHT JOINでこれが可能かどうかわかりません。

+0

'一般的に'!?!? – Strawberry

+0

?[](http://example.com) –

関連する問題