2013-12-06 4 views
0

У меня есть сайт, который запрашивает профили преподавателей, когда пользователь ищет объект. Так, например, если я ищу математику, я получаю всех учителей, которые учат математике, - но, к сожалению, я не вижу других предметов, которые они учат, потому что мое условие включает только математику. Я в настоящее время использую:Присоединение к двум SQL-запросам

SELECT * 
     FROM subjects 
     INNER JOIN teachers_subjects ON 
     subjects.subject_id = teachers_subjects.subject_id 
     INNER JOIN users_teachers ON teachers_subjects.users_user_id = users_teachers.user_id 
     INNER JOIN users ON users_teachers.user_id = users.user_id 
     WHERE subjects.subject_en_name ='math' 

Это поможет мне учитель Джон, но это будет только сказать мне, что он учит математику, когда на самом деле он на самом деле учит науку и английский.

Эти два SQL-запроса работают. Первая:

SELECT users.user_id 
     FROM subjects 
     INNER JOIN teachers_subjects ON 
     subjects.subject_id = teachers_subjects.subject_id 
     INNER JOIN users_teachers ON teachers_subjects.users_user_id = users_teachers.user_id 
     INNER JOIN users ON users_teachers.user_id = users.user_id 
     WHERE subjects.subject_en_name ='math' 

Это вернет мне user_id, что я могу после этого заткнуть в это:

SELECT * 
     FROM subjects 
     INNER JOIN teachers_subjects ON 
     subjects.subject_id = teachers_subjects.subject_id 
     INNER JOIN users_teachers ON teachers_subjects.users_user_id = users_teachers.user_id 
     INNER JOIN users ON users_teachers.user_id = users.user_id 
     WHERE users.user_id = 100 

Который дает мне всю информацию, которую мне нужно об Иоанне, в том числе тот факт, что он учит математика, наука и английский, хотя мой первый запрос задал только вопрос о математике. Я хотел бы знать, как я могу объединить эти два запроса, поэтому мне не нужно дважды запрашивать базу данных при каждом поиске.

UDPATE

Благодаря @DRapp, я думаю, что это может работать:

SELECT 
    * 

    from 
    (SELECT distinct 
      ts.users_user_id 
     from 
      subjects s 
      JOIN teachers_subjects ts 
       ON s.subject_ID = ts.subject_id 
     where 
      s.subject_en_name = 'math') qualified 
    JOIN users u 
     ON qualified.users_user_id = u.user_id 
    JOIN users_teachers ut 
     ON qualified.users_user_id = ut.user_id 
    JOIN teachers_subjects ts2  
     ON qualified.users_user_id = ts2.users_user_id 
     JOIN subjects s2 
      ON ts2.subject_id = s2.subject_id 
+1

Просто присоединитесь к таблице дважды. – Strawberry

+0

@ Струберри извините, какие две таблицы вы рекомендуете присоединяться? – compguy24

+0

teachers_subjects – Strawberry

ответ

2

Начало первой с квалифицируется ВОЗ для обучения данного класса (математика)

SELECT distinct 
     ts.users_user_id 
    from 
     subjects s 
     JOIN teachers_subjects ts 
      ON s.subject_ID = ts.subject_id 
    where 
     s.subject_en_name = 'math' 

Итак, это даст уникальный ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ Учителя, который КВАЛИФИЦИРУЕТ ... Теперь подумайте, что вы хотите, чтобы любой преподаватель учил математике ИЛИ английскому. Просто измените предложение where from = 'math' на IN ('math', 'English'). Он все равно даст вам только один экземпляр учителя, даже если они учат обоих или только одного или другого.

Теперь, чтобы получить остальную часть того, что вы хотите. Из этого списка квалифицированных преподавателей для предмета (ов) в вопросе, теперь получите остальные детали ... оберните это в другой запрос, поскольку ... Я стараюсь никогда не использовать wild-cards для многих целей, поэтому я просто угадывая имена некоторых столбцов в ассоциированной таблице пользователей для получения информации о преподавателях.

SELECT 
     qualified.users_user_id, 
     u.TeacherName, 
     u.TeacherEmail, 
     ts2.OtherInformationThatMayBeAvailable, 
     s2.subject_id, 
     s2.subject_en_name, 
     s2.anyOtherSubjectBasedFields 
    from 
     (SELECT distinct 
       ts.users_user_id 
      from 
       subjects s 
       JOIN teachers_subjects ts 
        ON s.subject_ID = ts.subject_id 
      where 
       s.subject_en_name = 'math') qualified 
     JOIN users u  <-- this join to get teacher name info 
      ON qualified.users_user_id = u.user_id 
     JOIN teachers_subjects ts2 <-- this to now get ALL classes per teacher qualified 
      ON qualified.users_user_id = ts2.users_userID 
      JOIN subjects s2 <-- for subjects details that the teacher TEACHES 
       ON ts2.subject_id = s2.subject_id 

ОБЯЗАТЕЛЬНО STRIP МОИ ЗАМЕТКИ через < - комментарий на РЕГИСТРИРУЙТЕСЬ компонента в запросе

Так, если учитель квалифицирован по математике, но и учит науку и английский язык, это вернет 3 записи для этого одного учителя. Если другой учит только математику, одну запись для них ... и другую учительскую математику и социальные исследования, затем два для этого человека.

Опять же, это включает в себя все уникальные предметы, которые вы можете захотеть захватить из предметов и/или предметов преподавателя.

Если вы не заботитесь обо всех конкретных деталях, то вы делаете группу по идентификатору пользователя учителя и делаете «group_concat (s2.subject_en_name, ',')», и он будет создавать список за каждый запись учителя как «математика, наука, английский»

+0

эй. У меня много проблем с тем, чтобы ваш запрос работал ... он возвращает всех пользователей, даже тех, кто не учит math – compguy24

+0

@ compguy24, начните только с первого запроса, где он получает только учителей, которые учат математике ... Это СЛЕДУЕТ работать, поскольку это все, о чем он просит, даже имя учителя, а только идентификатор ... Если это так , что является основой записей во втором запросе, где он является псевдонимом «Квалифицированный», затем присоединяется к учителям/субъектам этого КВАЛИФИЦИРОВАННОГО пользователя, а затем к предметам для этого учителя/пользователя. – DRapp

+0

в этой первой строке, SELECT Qualified.users_user_id, похоже, что моя система не распознает псевдоним – compguy24

Смежные вопросы