どのように左の部分を複数のテーブルに渡って制限するwhere節を使って左の結合を書くのですか?

私はいくつかの他のテーブルのデータに基づいて、あるテーブルの特定のデータを収集するSQLクエリを記述しようとしています。その部分は十分に簡単でした。残念ながら、私はまた、2番目のテーブルからデータを回復する必要があります。これは、左結合で行う必要があります。

私がちょうど左の結合をしたら、e。 g。

select *
from table_A A
left join table_B B on A.id=B.id

すべて順調。私はwhere句を安全に追加することができます。

where A.id>5

この問題は、たとえば、左側に複数のテーブルがある場合に発生します

select *
from table_A, table_C
left join table_B on A.id=B.id
where table_A.id=table_C.id

突然、A.idはもはや認識された列ではありません。私はAooをfooとして選択してからfoo = B.idを実行するように変更しようとしましたが、fooも認識されませんでした。 ( 'on節'で不明な列 'bla')

いくつかの例では単純なwhere句を使用していますが、左側にはjoin句、where句、および複数のテーブルを組み合わせることはできません。

質問の背景について:

私の元の質問は:

select SQL_CALC_FOUND_ROWS tutor_user.username
    , tutor_user.userid
    , tutor_tutor.rate
    , tutor_user.username 
from tutor_user
    , tutor_attends
    , tutor_tutors_in
    , tutor_subject
    , tutor_tutor 
where tutor_user.userid=tutor_attends.userid 
    and tutor_attends.schoolid=80 
    and tutor_tutors_in.userid=tutor_user.userid 
    and tutor_tutors_in.subjectid=tutor_subject.subjectID 
    and tutor_subject.name='Aerospace Studies' 
    and tutor_tutor.userid=tutor_user.userid //ERROR
LIMIT 0, 15

残念ながら、tutor_tutorの情報がすべてのユーザーに存在するという保証はありません。これは、Webサイト/データベースの設計サイクルの早い段階で貧弱な決断が続くという小さな欠陥です。したがって、簡単な解決方法は、結合に変換することです。

問題は、joinとwhere節を組み合わせる方法を説明する良いチュートリアルは見つかりません。私の最善の努力は次のようになります:

select SQL_CALC_FOUND_ROWS tutor_user.username
    , tutor_user.userid
    , tutor_tutor.rate
    , tutor_user.username 
from tutor_user
    , tutor_attends
    , tutor_tutors_in
    , tutor_subject
LEFT JOIN tutor_tutor
    on tutor_user.userid=tutor_tutor.userid
where tutor_user.userid=tutor_attends.userid 
    and tutor_attends.schoolid=80 
    and tutor_tutors_in.userid=tutor_user.userid 
    and tutor_tutors_in.subjectid=tutor_subject.subjectID 
    and tutor_subject.name='Aerospace Studies' 
    LIMIT 0, 15
2
皆さんのお返事ありがとうございます。ジョインを使って 'where'ステートメントは私が以前考えたことではないものとして行動します。私の訓練が教師の多くが時代遅れである州立大学で行われていたことを考えると、私は「時代遅れの表記法」を使っていることを私には驚かせません。 (それらの1つは、コンピュータプロジェクタが利用可能であっても、オーバーヘッドプロジェクタを使用します)
追加された 著者 RonLugge,

4 答え

理想的には、lazy join構文( select ... from a、b、c )を、より具体的な select ... join B ... join c ... また、 select * を実行することも問題になる可能性があります。特に、すべてのフィールドを使用しない、またはpositionではなく名前でフィールドを参照する必要があります。

したがって、あなたの質問は次のようになります:

SELECT A.field, A.otherfield, B.field, B.otherfield, C.yetanotherfield
FROM table_A AS A
JOIN table_B as B on A.id = B.a_id
JOIN table_C as C on B.id = C.b_id
WHERE ...
5
追加された

JOIN に複数の句を入れることができます。

SELECT * 
FROM table_a A
    LEFT OUTER JOIN table_b B
        ON A.col1 = B.col1 
             AND A.col2 = B.col2
             AND B.col3 > 5

You can write the criteria in the where clause, but that is outdated notation. If you do, however, want to pu the join clause in the WHERE anyway then add an OR to handle NULL otherwise it ceases to be a LEFT JOIN

例えば

SELECT * 
FROM table_a A
    LEFT OUTER JOIN table_b B
        ON A.col1 = B.col1 
             AND A.col2 = B.col2
WHERE (B.col3 > 5 OR B.col3 IS NULL)
3
追加された

OK。たくさんのもの...

select *   table_A、table_Cから   A.id = B.idにtable_Bを残したままにする   where table_A.id = table_C.id   突然、A.idはもはや認識された列ではありません。私はAooをfooとして選択してからfoo = B.idを実行するように変更しようとしましたが、fooも認識されませんでした。 ( 'on節'で不明な列 'bla')

Aの名前のテーブルまたはエイリアスが存在しません。テーブルの名前の前にエイリアスを配置する必要があります。

select *
from table_A A, table_C
left join table_B on A.id=B.id
where table_A.id=table_C.id

しかし、なぜあなたはカンマ(、)で結合を使用していますか?
それは、より良い結合ステートメントを使用しています。 それは次のようなものでなければなりません:

select * /* any collmn you want */
from tutor_user u
  left join tutor_attends a ON a.userid = u.userid
  left join tutor_tutors_in t ON t.userid = u.userid  
  left join tutor_subject s ON s.subjectid = t.subjectid
  LEFT JOIN tutor_tutor tt on u.userid = tt.userid 

where tutor_attends.schoolid=80 
and tutor_subject.name='Aerospace Studies'

Take a look on 'alias'.
Also you can try the doc: http://dev.mysql.com/doc/refman/5.0/en/select.html

3
追加された
詳細な答えをありがとう。あなたは急いで私の急いでスケッチした、正しい例は構文上の誤りです(btw、あなたのtutor_attends.schoolidは無効です、代わりに 'a'を使う必要があります:D)。興味深いことに、あなたの左の結合が正しく動作するように見えます。それは、私が彼らの意味を理解していないことを示唆しています。
追加された 著者 RonLugge,

おそらくこのようなものが必要でしょう:

select A.*, B.field1, C.field3 from A
    left join B on A.id=B.id
    left join C on A.id=C.id
    where C.field5 = 'foo'
2
追加された
良い答えです。もし私が2つの答えを与えることができれば、私はこれを考慮するかもしれません。最初の書式設定を無視して、それに対する最大の欠点は、純粋に左の結合を使用したことです。左の結合の1つだけが結合を残す必要があります。それ以外の場合は、A.id = B.idのすべての場合を選択し、他の列からデータを取得できる場合は取得します。右からのデータの可用性に基づいて左の結果を制限するため、内部結合(または単に「結合」)が適切です。
追加された 著者 RonLugge,
編集のおかげで:)
追加された 著者 dryliketoast,