Это проблема. При выполнении любого запроса этого типа
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.
Мой вопрос заключается в том, что я делаю неправильно, и если это ошибка, как мне избежать ее сохранения? та же структура запроса.