2016-05-29 16 views
0

私は2つのテーブルを持っています。最初のテーブルには、各ジョブについての情報:各ジョブに関連する複数のレコードを表示する複数の結合

+--------+------------+ 
| JOB_ID | JOB_NAME | 
+--------+------------+ 
|  |   | 
| 1  | Test Job 1 | 
|  |   | 
| 2  | Test Job 2 | 
|  |   | 
| 3  | Test Job 3 | 
|  |   | 
| 4  | Test Job 4 | 
|  |   | 
| 5  | Test Job 5 | 
|  |   | 
| 6  | Test Job 6 | 
|  |   | 
| 7  | Test Job 7 | 
+--------+------------+ 

そして第二に、テーブル、店舗1つ以上の「科目」:

+------------+--------+------------------+ 
| SUBJECT_ID | JOB_ID | SUBJECT_NAME | 
+------------+--------+------------------+ 
|   |  |     | 
| 1   | 1  | Test Subject #1 | 
|   |  |     | 
| 2   | 1  | Test Subject #2 | 
|   |  |     | 
| 3   | 1  | Test Subject #3 | 
|   |  |     | 
| 4   | 2  | Test Subject #4 | 
|   |  |     | 
| 5   | 3  | Test Subject #5 | 
|   |  |     | 
| 6   | 3  | Test Subject #6 | 
|   |  |     | 
| 7   | 3  | Test Subject #7 | 
|   |  |     | 
| 8   | 4  | Test Subject #8 | 
|   |  |     | 
| 9   | 5  | Test Subject #9 | 
|   |  |     | 
| 10   | 6  | Test Subject #10 | 
|   |  |     | 
| 11   | 7  | Test Subject #11 | 
|   |  |     | 
| 12   | 7  | Test Subject #12 | 
|   |  |     | 
| 13   | 7  | Test Subject #13 | 
+------------+--------+------------------+ 

現在、私はすべてを示すSQL文を持っていますジョブ、二つのフィールドの最初の2つの「科目」、下回る結果:

+--------+------------+------------------+------------------+ 
| JOB_ID | JOB_NAME | SUBJECT 1  | SUBJECT 2  | 
+--------+------------+------------------+------------------+ 
|  |   |     |     | 
| 1  | Test Job 1 | Test Subject #1 | Test Subject #2 | 
|  |   |     |     | 
| 2  | Test Job 2 | Test Subject #4 |     | 
|  |   |     |     | 
| 3  | Test Job 3 | Test Subject #5 | Test Subject #6 | 
|  |   |     |     | 
| 4  | Test Job 4 | Test Subject #8 |     | 
|  |   |     |     | 
| 5  | Test Job 5 | Test Subject #9 |     | 
|  |   |     |     | 
| 6  | Test Job 6 | Test Subject #10 |     | 
|  |   |     |     | 
| 7  | Test Job 7 | Test Subject #11 | Test Subject #12 | 
+--------+------------+------------------+------------------+ 

。これは、以下のSQLによって生成されます

SELECT job.job_id as 'Id', 
job.job_name as 'JobName', 
Subjects1.Subject as 'Subject 1', 
Subjects2.Subject as 'Subject 2', 
LEFT JOIN job_Subjects as Subjects1 ON Subjects1.job_id = job.job_id AND Subjects1.Subject_id = (SELECT Subject_id FROM job_Subjects WHERE job_Subjects.job_id = job.job_id ORDER BY job_Subjects.Subject_index LIMIT 1) 
LEFT JOIN job_Subjects as Subjects2 ON Subjects2.job_id = job.job_id AND Subjects2.Subject_id = (SELECT Subject_id FROM job_Subjects WHERE job_Subjects.job_id = job.job_id ORDER BY job_Subjects.Subject_index LIMIT 1,1) 

ただし、件名(job_subjects.subjectフィールド)を検索する必要もあります。

は、私は、次の試してみた:

  • 追加 "をWHERE job_subjects.subject LIKE '%テストジョブ3%'" - しかし、私は次のエラーを取得:「不明な列 'job_subjects.subject' 内を'where節' "
  • 別のジョイン「LEFT JOIN job_subjectsをSearchSubjects ON SearchSubjects .job_id = job.job_id」に追加し、「WHERE SearchSubjects.subject LIKE '%Test Job 3%」を追加しましたが、複数のJOB結果(それは、それが見つけたすべての主題結果のためのジョブ行の結果を生成するようです)。

2つの結合を同時に維持しながら、どのようにして対象テーブルを検索できますか?

答えて

1

MySQLには便利な拡張機能があり、HAVING句を使用して必要な処理を行うことができます。まず、列名にバックティックを使用するか、エスケープする必要のない名前を使用することをお勧めします。

SELECT job.job_id as Id, job.job_name as JobName, 
     Subjects1.Subject as Subject1, 
     Subjects2.Subject as Subject2 
FROM ?? LEFT JOIN 
    job_Subjects Subjects1 
    ON Subjects1.job_id = job.job_id AND 
     Subjects1.Subject_id = (SELECT Subject_id FROM job_Subjects WHERE job_Subjects.job_id = job.job_id ORDER BY job_Subjects.Subject_index LIMIT 1 
           ) LEFT JOIN 
    job_Subjects Subjects2 
    ON Subjects2.job_id = job.job_id AND 
     Subjects2.Subject_id = (SELECT Subject_id FROM job_Subjects WHERE job_Subjects.job_id = job.job_id ORDER BY job_Subjects.Subject_index LIMIT 1,1 
           ) 
HAVING Subject1 LIKE '%Test Job 3%'; 

サブクエリを使用することもできます。それはもっと伝統的なアプローチでしょう。しかし、MySQLはサブクエリを実現し、パフォーマンスのオーバーヘッドが発生します。

+0

ニースの回答! 1つの質問...あなたはサブクエリが余分のオーバーヘッドになると言う。それはあなたの参加のサブクエリとは何か違うのですか?あなたがそれを制限していることを除いて、それは従属サブクエリのようなものです。私はそれがどのようにより効果的であるかを完全に理解しているかわかりません。 –

+0

ありがとうございましたGordon - 実際に私が望む結果を与えてくれています(これはすごいです)。しかし、上記のクエリは約43秒で実行されています(以前は約1〜2秒でした)。クエリを改善/最適化しますか? @AndrewMilici。 –

+0

。 。これをより速くする方法については、*別の*クエリを尋ねたいかもしれません。 –