Неизвестный столбец в предложении Where

У меня простой запрос:

SELECT u_name AS user_name FROM users WHERE user_name = "john";

Получаю Unknown Column 'user_name' in where clause. Могу ли я не ссылаться на 'user_name' в других частях заявления даже после select 'u_name as user_name'?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
128
0
288 112
18

Ответы 18

Нет, ты не можешь. user_name не существует до времени возврата.

Нет, вам нужно выбрать его с правильным именем. Если вы указали таблицу, которую выбираете из псевдонима, вы можете использовать это.

исправлено:

SELECT u_name AS user_name FROM users WHERE u_name = 'john';

SQL оценивается в обратном порядке, справа налево. Таким образом, предложение where анализируется и оценивается до предложения select. Из-за этого псевдоним u_name на user_name еще не произошел.

Я думаю, что лучше сказать "наизнанку", чем "назад".

Joe Phillips 26.05.2010 07:35

Имеет смысл сказать, что весь оператор анализируется, преобразуется и оптимизируется в целом в рамках сложного многоступенчатого процесса. "SQL оценивается в обратном порядке, справа налево" неправильно.

David Aldridge 28.09.2016 22:54

неполный ответ, поскольку пользователь спросил, можно ли использовать "user_name" в заявлении, которое может быть после, например "ИМЕЕТ"

luke_mclachlan 18.09.2018 23:02

Либо:

SELECT u_name AS user_name
FROM   users
WHERE  u_name = "john";

или же:

SELECT user_name
from
(
SELECT u_name AS user_name
FROM   users
)
WHERE  u_name = "john";

Последнее должно быть таким же, как и первое, если СУБД поддерживает отправку предикатов во встроенное представление.

select u_name as user_name from users where u_name = "john";

Подумайте об этом так: ваше предложение where сначала оценивается, чтобы определить, какие строки (или соединенные строки) необходимо вернуть. После выполнения предложения where для него выполняется предложение select.

Проще говоря, представьте себе следующее:

select distinct(u_name) as user_name from users where u_name = "john";

Вы не можете ссылаться на первую половину без второй. Где всегда сначала оценивается, затем предложение select.

Хотя вы можете использовать псевдонимы для своих таблиц в запросе (например, «SELECT u.username FROM users u;»), вы должны использовать фактические имена столбцов, на которые вы ссылаетесь. AS влияет только на то, как возвращаются поля.

Я думаю, вы можете использовать псевдоним в некоторых СУБД, например MySql. Однако вы правы для Sql Server.

PeteGO 28.04.2014 21:58

См. Следующую страницу руководства MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html

"A select_expr can be given an alias using AS alias_name. The alias is used as the expression's column name and can be used in GROUP BY, ORDER BY, or HAVING clauses."

(...)

It is not permissible to refer to a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed. See Section B.5.4.4, “Problems with Column Aliases”.

Также обратите внимание (от человека по MySQL): стандарт SQL требует, чтобы HAVING ссылался только на столбцы в предложении GROUP BY или столбцы, используемые в агрегатных функциях. Однако MySQL поддерживает расширение этого поведения и позволяет HAVING ссылаться на столбцы в списке SELECT, а также на столбцы во внешних подзапросах.

Vincent Pazeller 22.09.2017 13:47

SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"

Зачем вам нужен подзапрос? Гораздо проще без.

PeteGO 28.04.2014 22:00

Неизвестный столбец в предложении WHERE, вызванный строками 1 и 2 и разрешенный строкой 3:

  1. $sql = "SELECT * FROM users WHERE username = ".$userName;
  2. $sql = "SELECT * FROM users WHERE username = ".$userName."";
  3. $sql = "SELECT * FROM users WHERE username ='".$userName."'";

Что вы изменили и почему? Кроме того, почему вы разместили код, который широко открыт для SQL-инъекций?

Nico Haase 14.11.2019 16:14

Что о:

SELECT u_name AS user_name FROM users HAVING user_name = "john";

Зачем в этом случае использовать HAVING вместо WHERE?

PeteGO 28.04.2014 21:54

@PeteGO относится к ответу Пола Диксона. tldr; HAVING оценивается позже, чем WHERE и, что более важно, SELECT.

jairbow 19.03.2017 21:16

Если вы пытаетесь выполнить следующий запрос (найти все узлы с хотя бы одним вложением), в котором вы использовали оператор SELECT для создания нового поля, которое на самом деле не существует в базе данных, и попробуйте использовать псевдоним для этого результата вы столкнетесь с той же проблемой:

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
WHERE attachments.nodeid = nodes.id) AS attachmentcount 
FROM nodes
WHERE attachmentcount > 0;

Вы получите сообщение об ошибке «Неизвестный столбец 'attachmentcount' в предложении WHERE».

Решение на самом деле довольно простое - просто замените псевдоним оператором, который создает псевдоним, например:

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
WHERE attachments.nodeid = nodes.id) AS attachmentcount 
FROM nodes 
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;

Вы все равно получите возвращенный псевдоним, но теперь SQL не должен работать с неизвестным псевдонимом.

Я столкнулся с этой проблемой и наткнулся на ваш ответ - спасибо! Следует отметить, что это (понятно) немного медленнее для больших баз данных, но я все равно имею дело с глупой настройкой унаследованной базы данных.

Liam Newmarch 08.09.2011 14:55

Я считаю, что у вас есть дополнительный ( в вашем запросе перед (COUNT(*), который нигде не закрывается.

tftd 27.11.2012 20:09

Но разве оператор SELECT не запускается дважды?

Matej 26.02.2015 02:21

Я далеко не эксперт по mysql, но это кажется очень неэффективным. Я испытал, что вложенные выборки значительно замедляют выполнение запроса.

GDY 16.08.2019 15:53

Может быть поможет.

Ты можешь

SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";

Оно работает.

НО УБЕДИТЕСЬ, ЧТО ВЫ ДЕЛАЕТЕ!

  • Индексы здесь НЕ ИСПОЛЬЗУЮТСЯ
  • Будет просканирована ПОЛНАЯ ТАБЛИЦА - вы не указали часть LIMIT 1
  • Итак, - ЭТОТ ЗАПРОС БУДЕТ ПРОСМОТРЕТЬ на огромных таблицах.

Но, может быть, в некоторых случаях это помогает

У меня была такая же проблема, я нашел это полезным.

mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");

не забудьте заключить $ user в одинарные кавычки.

Этот код широко открыт для SQL-инъекций. Никто не должен использовать этот код для решения данной проблемы.

Nico Haase 14.11.2019 16:13

Ваш определенный alias не приветствуется предложением WHERE, вы должны использовать предложение HAVING для этого

SELECT u_name AS user_name FROM users HAVING user_name = "john";

ИЛИ вы можете напрямую использовать исходное имя столбца с WHERE

SELECT u_name AS user_name FROM users WHERE u_name = "john";

Так же, как у вас есть результат в определяемом пользователем псевдониме в результате подзапроса или любого вычисления, к нему будет обращаться предложение HAVING, а не WHERE

SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users  WHERE u_name = "john" HAVING user_last_name ='smith'

Просто была эта проблема.

Убедитесь, что в имени объекта в базе данных нет места.

например user_name вместо user_name

попробуйте свою задачу, используя условие В или условие ИЛИ ЖЕ, а также этот запрос работает на spark-1.6.x

 SELECT  patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');

или же

SELECT  patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';

Для меня корнем проблемы был номер, который я скопировал для использования в предложении WHERE. Номер имел «невидимый» символ, по крайней мере, для MySQL Workbench. Я поместил номер в консоль Chrome, он был хорошо виден.

Другие вопросы по теме