Проблема со всеми запросами MySQL SELECT, содержащими подзапрос EXISTS и LEFT JOIN с ON, где ON имеет ссылку на внешний SELECT - PullRequest
1 голос
/ 09 ноября 2019

Это проблема. При выполнении любого запроса этого типа

SELECT field1
FROM table1
WHERE EXISTS (SELECT table2.field2, table3.field3, table3.field4
              FROM table2 LEFT JOIN table3 ON table3.field3 = table2.field2 
                                           AND table3.field4 = table1.field1
              WHERE "some condition");

я получаю эту ошибку:

Unknown column 'table1.field1' in 'on clause'

С другой стороны, этот запрос

SELECT field1
FROM table1
WHERE EXISTS (SELECT table2.field2, table3.field3, table3.field4
              FROM table2 LEFT JOIN table3 ON table3.field3 = table2.field2 
              WHERE "some condition"
                AND table3.field4 = table1.field1);

работает нормально.

Существуют возможные альтернативы, например, это может быть внутреннее соединение, а не внешнее, отрицательная проверка подзапроса (не существует), где предложение не обязательно и список полей может отличаться. Единственная критическая часть - это подзапрос EXISTS и ссылка на table1.field1 в состоянии ON от JOIN.

Я пробовал его на нескольких серверах MySQL и MariaDB с одинаковым результатом! Также пытался найти точно такой же вопрос в Интернете и здесь на SO - безуспешно.

Согласно предложению, приведенному в одном из комментариев, я модифицирую вопрос реальным примером.

Таблицы:

CREATE TABLE `sessions` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) DEFAULT NULL,
    `browser` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
)

CREATE TABLE `browsers` (               
    `id` int(11) NOT NULL DEFAULT '0',
    `browser` varchar(255) DEFAULT NULL
)

И чтобы получить всех пользователей, которые использовали все браузеры, я запускаю этот запрос

select distinct user_id
from sessions as t1
where not exists (select t2.id, browsers.id
                  from sessions as t2 LEFT JOIN browsers ON t2.browser = browsers.browser 
                                                         AND t2.user_id = t1.user_id
                  where browsers.id IS NULL);

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

Error Code : 1054
Unknown column 't1.user_id' in 'on clause'

И, конечно, желаемый вывод, который мне нужен, это выбор результатов запроса с перечислением пользователей.

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

Мой вопрос заключается в том, что я делаю неправильно, и если это ошибка, как мне избежать ее сохранения? та же структура запроса.

...