"из таблицы @events_tag" - Вы имеете в виду, что имя таблицы является переменной?Это невозможно сделать без создания запроса ни в коде приложения, ни в хранимой подпрограмме.Последний будет использовать CONCAT
, PREPARE
и EXECUTE
.
Предложение ON
должно указывать, как связаны две таблицы.Не включайте условия фильтрации.
Итак, измените
FROM sessions a_s
LEFT JOIN events_tag_rel a_etr ON a_etr.tag_id = et.id
WHERE a_s.event_id = a_etr.event_id AND a_s.date_start >= NOW()
на
FROM sessions AS s
LEFT JOIN events_tag_rel AS etr ON s.event_id = etr.event_id
WHERE etr.tag_id = et.id
AND s.date_start >= NOW()
Более того, LEFT
, вероятно, бесполезен в этом контексте.
Список выбора не имеет значения в EXISTS
:
EXISTS ( SELECT id FROM ... )
->
EXISTS ( SELECT 1 FROM ... )
Индексы, которые могут быть полезны:
etr: INDEX(tag_id, event_id) -- in either order
s: INDEX(date_start, event_id)
s: INDEX(event_id, date_start)