2014-01-28 3 views
0

У меня есть что-то вроде этого:MySQL оптимизации запросов для OR с 3 таблицами

таблицы:

ct_lectures [id, l_id,name,position] 

ct_teachers_lectures [id, t_id, l_id] 

ct_teachers [id, name, surname, position] 

ct_teachers_languages [id, t_id, lang_id] 

Сначала я перечисляют все лекции, а затем я пытаюсь найти учителей, которые связаны с этими лекциями и говорить специфический язык:

SELECT DISTINCT ct_teachers.* FROM ct_teachers_lectures, ct_teachers, ct_teachers_languages WHERE (

(ct_teachers_lectures.l_id = 27 AND ct_teachers.id = ct_teachers_lectures.t_id AND ct_teachers_languages.t_id = ct_teachers_lectures.t_id) OR 
(ct_teachers_lectures.l_id = 67 AND ct_teachers.id = ct_teachers_lectures.t_id AND ct_teachers_languages.t_id = ct_teachers_lectures.t_id) OR 
(ct_teachers_lectures.l_id = 133 AND ct_teachers.id = ct_teachers_lectures.t_id AND ct_teachers_languages.t_id = ct_teachers_lectures.t_id) OR 
(ct_teachers_lectures.l_id = 262 AND ct_teachers.id = ct_teachers_lectures.t_id AND ct_teachers_languages.t_id = ct_teachers_lectures.t_id) 

ORDER BY ct_teachers.id DESC LIMIT 30 

там может быть даже 15 лекций (выше пример с 4) Я хочу Seach, так что будет в 15 раз, что линия:

(ct_teachers_lectures.l_id = **ID** AND ct_teachers.id = ct_teachers_lectures.t_id AND ct_teachers_languages.t_id = ct_teachers_lectures.t_id) OR 

Есть ли лучший способ получить этих учителей из базы данных вместо того, чтобы делать этот большой запрос? Или это нормально, что эти запросы такие большие?

ответ

2
SELECT DISTINCT 
     ct_t.* 
    FROM 
     ct_teachers ct_t 
     INNER JOIN ct_teachers_lectures ct_tlect 
      ON ct_tlect.t_id = ct_t.id 
     INNER JOIN ct_teachers_languages 
      ON ct_tlang.t_id = ct_tlect.t_id 
    WHERE 
      ct_tlect.l_id = 27 
     OR ct_tlect.l_id = 67 
     OR ct_tlect.l_id = 133 
     OR ct_tlect.l_id = 262 
    ORDER BY 
     ct_t.id DESC 
    LIMIT 30; 
+1

Кроме того, вы можете использовать, где ct_tlect.l_id IN (27, 67, 133, 262) – DRapp

+0

Красивая, спасибо! –

0

Не обращая внимания на JOINs, используя несколько запросов с UNION ALL вместо OR.

+0

Спасибо. Итак, каждый идентификатор tritment имеет собственный SELECT и UNION между этими SELECT? Я думаю, что лучше использовать UNION, потому что я хочу иметь список уникальных учителей. –

+0

Да, точно. Но, как вы уже заметили, это может вернуть дубликаты (которые могут или не могут существовать, в зависимости от ваших данных). Но использование 'UNION' вместо' UNION ALL' побеждает цель, так как результаты должны быть снова отсортированы по базе данных, что ухудшает производительность. Поэтому лучше пойдите с запросом, предложенным выше! –

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