Использование псевдонима столбца в предложении WHERE запроса MySQL приводит к ошибке
запрос я таков, но я получаю эту ошибку:
#1054-неизвестный столбец 'guaranteed_postcode' в 'IN/ALL/ANY subquery'
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE `guaranteed_postcode` NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
мой вопрос: почему я не могу использовать поддельный столбец в предложении where того же запроса БД?
8 ответов:
вы можете использовать только псевдонимы столбцов в предложениях GROUP BY, ORDER BY или HAVING.
стандартный SQL не позволяет см. псевдоним столбца в поле где пункт. Это ограничение вводится потому что, когда где код выполняется, значение столбца может еще не быть решить.
скопировал из документация MySQL
Как указано в комментариях, использование HAVING вместо этого может выполнять работу. Обязательно дайте прочитать по адресу это , где был хотя.
Как отметил Виктор, проблема заключается в псевдониме. Однако этого можно избежать, поместив выражение непосредственно в предложение WHERE x IN y:
SELECT `users`.`first_name`,`users`.`last_name`,`users`.`email`,SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ( 'australia' ) )однако, я думаю, что это очень неэффективно, так как подзапрос должен быть выполнен для каждой строки внешнего запроса.
стандартный SQL( или MySQL) не позволяет использовать псевдонимы столбцов в предложении WHERE, потому что
при вычислении предложения WHERE значение столбца может еще не быть определено.
(от документация MySQL). Что вы можете сделать, это вычислить значение столбца здесь предложение, сохраните значение в переменной и используйте его в списке полей. Например, вы могли бы сделать это:
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, @postcode AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE (@postcode := SUBSTRING(`locations`.`raw`,-6,4)) NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ( 'australia' ) )этот позволяет избежать повторения выражения, когда оно усложняется, что упрощает обслуживание кода.
возможно, мой ответ слишком поздно, но это может помочь другим.
вы можете заключить его с другим оператором select и использовать предложение where к нему.
SELECT * FROM (Select col1, col2,...) as t WHERE t.calcAlias > 0calcAlias-это столбец псевдонима, который был вычислен.
вы можете использовать предложение HAVING для фильтра, рассчитанного в выбранных полях и псевдонимах
Я использую mysql 5.5.24 и следующий код работает:
select * from ( SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` ) as a WHERE guaranteed_postcode NOT IN --this is where the fake col is being used ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ( 'australia' ) )
стандартный SQL запрещает ссылки на псевдонимы столбцов в предложении WHERE. Это ограничение накладывается потому, что при вычислении предложения WHERE значение столбца может еще не быть определено. Например, следующий запрос является незаконным:
выберите id, COUNT (*) как cnt из tbl_name, где cnt > 0 GROUP by id;
вы можете использовать подстроку (
locations.raw,-6,4), где условиеSELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ( 'australia' ) )
Comments