2017-02-17 9 views
0

結合されたテーブルから情報を抽出するために、私もSQLクエリパターンのこの種に名前を付ける方法がわからない...私は、以下の単純化されたテーブルがあります。SQLクエリは、私はSQLクエリといくつかの助けが必要

 
teachers: 
    ID | NAME 
    1 | john 
    2 | paul 

teachers_subjects: 
    TEACHER_ID | SUBJECT_ID 
    1   | 42 
    1   | 43 
    2   | 43 


subjects: 
    ID | NAME 
    42 | english 
    43 | french 

これはかなり簡単です:教師は多くの科目を教えることができます。今、私は "英語"と "フランス語"の両方を教えることができるすべての教師を見つける必要があります(これは "ジョン"です)。そのためのSQLクエリは何でしょうか?

+1

あなたは、MySQLやPostgreSQLを使用していますか? (含まれていない製品にはタグを付けないでください) – jarlh

+0

そのテーブルのデータは、どのような結果になりますか? (書式付きテキストもここで指定してください。) – jarlh

+0

多対多の関係と呼ばれています。これまでに何を試しましたか? –

答えて

4

私はgroup byhavingでこれをしたい:

select ts.teacher_id 
from teachers_subjects ts join 
    subjects s 
    on ts.subject_id = s.id 
where s.name in ('English', 'French') 
group by ts.teacher_id 
having count(*) = 2; -- the teacher teaches both languages 

注:出力ではなく、IDというたい場合には、先生の名で参加することができます。

0

JOINすべてのテーブル。何かのように

select t.Name 
from teachers t 
join teachers_subjects ts on t.id = ts.teacher_id 
join subject s1 on ts.subject_id = s1.id 
join subject s2 on ts.subject_id = s2.id 
where s1.NAME = 'English' and s2.NAME = 'French' 
2

可能な解決策の1つは、フランス語を教える英語を教える教師とフランス語を教える教師を得るための個別のクエリを作成することです。これらのセットが両方ある場合は、intersectコマンドを使用して両方のセットに存在するものを見つけることができます。

対応するSQLコードは次のようになります

(SELECT teachers.name 
FROM teachers, teachers_subjects, subjects 
WHERE teachers.id = teachers_subject.id AND teachers_subjects.subject_id = subjects.id and subjects.name = "english") 
INTERSECT 
(SELECT teachers.name 
FROM teachers, teachers_subjects, subjects 
WHERE teachers.id = teachers_subject.id AND teachers_subjects.subject_id = subjects.id and subjects.name = "french") 
関連する問題