Как использовать значение из основного запроса в подзапросе (MariaDB) - PullRequest
0 голосов
/ 28 февраля 2019

Введение

Прошу не сердиться: в StackOverflow есть много тем с этим названием.Я перечитал их все, но у меня все еще есть проблемы.Возможно, я делаю что-то не так, или у меня старая версия СУБД ( У меня есть 10.1.30 MariaDB ).

Таблицы

1. @ events_tag

id,
title

2. @ events_tag_rel

event_id,
tag_id

2. @ сеансы

id,
event_id,
date_start

Запрос

SELECT et.* FROM events_tag et
WHERE EXISTS
(
    SELECT a_s.id 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()
)

Задача

Мне нужно использовать данные из основного запроса в подзапросах.В частности, я пытаюсь сделать следующее: получить все строки из таблицы @ events_tag , где существует связь с таблицей @ events_tag_rel (по столбцу @ tag_id ) итаблица @ сессий (по столбцу @ event_id ).

Но я получаю сообщение об ошибке:

Неизвестный столбец 'et.id'in' on оговорка '

1 Ответ

0 голосов
/ 12 марта 2019

"из таблицы @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)
...