У меня есть 3 таблицы, используемой в этом запросе:Можете ли вы улучшить обновление mysql с двумя встроенными выборами с помощью соединений?
- инструктора (содержит «мягкий» удален столбец)
- школы (содержит «мягкий» удален столбец)
- instructor_school (таблицу ассоциации между инструктором и школа)
Если школа помечаются как удаленные, я хочу, чтобы преподаватели этой школы также быть помечены как удаленные, но только если все их школ отмечены как удаленные. Вот мой предложенный запрос:
update instructor as i
set deleted=1
where
(select count(*) from instructor_school as i_s join school s
on s.id=i_s.school_id
where i_s.instructor_id=i.id) =
(select count(*) from instructor_school as i_s join school s
on s.id=i_s.school_id
where i_s.instructor_id=i.id and s.deleted=1);
Если мы только позволили каждому преподавателю, чтобы быть в одной школе, то запрос будет гораздо проще:
UPDATE instructor i
JOIN instructor_school as i_s ON i_s.instructor_id = i.id
JOIN school as s on s.id=i_s.school_id
SET i.deleted = 1
where s.deleted = 1
Мой вопрос - это запрос наилучший подход к решить эту проблему - или вы можете предложить лучший запрос?
Спасибо за любые предложения!
Большое спасибо! Это намного чище и, по-видимому, более эффективно. Я буду использовать его вместо предложенного выше запроса. –
Не должно ли положение on для левого соединения для trainor_school быть в конце этой строки и до соединения для s_active? Кроме того, a) не должно быть никаких строк в таблице ассоциации с одним столбцом как null, и b) если преподаватель связан с не удаленной школой, то мы не хотим, чтобы он был помечен как удаленный. Неужели я не понимаю ваш ответ? –
1) Я использовал ОБЪЕДИНЕНИЕ В ЛЕВОЙ ВСТУПЛЕНИИ - потому что я хочу ЛЕВОЕ ПРИСОЕДИНЯТЬСЯ к инструкторским школам, чтобы я не исключил никаких инструкторов, но я хочу сделать INNER JOIN в школу, потому что я хочу вернуть ТОЛЬКО школы, которые вернется с моего ВЛЕВОГО ПРИСОЕДИНЕНИЯ к инструкторским школам. Если вы хотите переключить это, вам придется изменить JOIN в школу (s_active) на LEFT JOIN. 2) a) Я не понимаю этот вопрос. b) Это именно то, что мы делаем, введя ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ С ВНУТРЕННЕМ ПРИСОЕДИНЕНИЕМ в активные школы, где i_s.active IS NULL. – user6655061