Запрос, который я выполняю, выглядит следующим образом, однако я получаю эту ошибку:
# 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 того же запроса к БД?
mysql
sql
mysql-error-1054
Джеймс
источник
источник
HAVING
выполняется медленнее, чемWHERE
having
том, что значения столбцов должны быть вычислены к тому времени, когда вы доберетесь доhaving
. Это не такwhere
, как указано выше.Как отметил Виктор, проблема в псевдониме. Этого можно избежать, поместив выражение непосредственно в предложение WHERE x IN y:
Тем не менее, я думаю, что это очень неэффективно, поскольку подзапрос должен выполняться для каждой строки внешнего запроса.
источник
Стандартный SQL (или MySQL) не разрешает использование псевдонимов столбцов в предложении WHERE, потому что
(из документации MySQL ). Что вы можете сделать, так это вычислить значение столбца в предложении WHERE , сохранить значение в переменной и использовать его в списке полей. Например, вы можете сделать это:
Это позволяет избежать повторения выражения, когда оно усложняется, что облегчает поддержку кода.
источник
select @code:=sum(2), 2*@code
работает в MySQL 5.5, но для меня в 5.6 второй столбец выдает NULL при первом вызове и возвращает 2 раза предыдущий результат при повторном запуске. Достаточно интересно, как выбрать@code:=2, 2*@code
иselect @code:=rand(), 2*@code
, кажется, работает в моих 5.6 (сегодня). Но они действительно пишут и читают в предложении SELECT; в вашем случае вы устанавливаете его в ГДЕ.Может быть, мой ответ слишком поздно, но это может помочь другим.
Вы можете заключить его в другой оператор select и использовать к нему предложение where.
calcAlias - это столбец псевдонимов, который был рассчитан.
источник
Вы можете использовать предложение HAVING для фильтра, рассчитанного в полях и псевдонимах SELECT.
источник
WHERE
иHAVING
, хотя. Они не идентичны. stackoverflow.com/search?q=where+vs+havingЯ использую MySQL 5.5.24 и работает следующий код:
источник
Стандартный SQL запрещает ссылки на псевдонимы столбцов в предложении WHERE. Это ограничение наложено потому, что при оценке предложения WHERE значение столбца может еще не быть определено. Например, следующий запрос недопустим:
SELECT id, COUNT (*) AS cnt ОТ tbl_name WHERE cnt> 0 GROUP BY id;
источник
Вы можете использовать SUBSTRING (
locations
.raw
, -6,4) для где условияисточник