Неизвестная колонка в разделе Где

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

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'?

Ответ 1

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

Ответ 2

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

"При выборе select_expr может быть задан псевдоним используя AS alias_name. Используется псевдоним как имя столбца выражения и может использоваться в GROUP BY, ORDER BY или HAVING."

Ответ 3

Как насчет:

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

Ответ 4

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.

Ответ 5

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

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

Вы получите сообщение об ошибке "Unknowncountcountcount" в предложении 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 не должен биться с неизвестным псевдонимом.

Ответ 6

Или:

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";

Последний должен быть таким же, как и предыдущий, если RDBMS поддерживает предикат, нажав на потоковое представление.

Ответ 7

исправлено:

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

Ответ 8

Ваш выделенный 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'

Ответ 9

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

Ответ 10

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

Ответ 11

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

  • $sql = "SELECT * FROM users WHERE username =".$userName;
  • $sql = "SELECT * FROM users WHERE username =".$userName."";
  • $sql = "SELECT * FROM users WHERE username ='".$userName."'";

Ответ 12

Может быть, это помогает.

Вы можете

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

Он работает.

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

  • Индексы НЕ ИСПОЛЬЗУЮТСЯ здесь.
  • Будет сканироваться FULL TABLE - вы не указали часть LIMIT 1
  • Итак, - ЭТОТ QUERY БУДЕТ SLLLOOOOOOW на огромных столах.

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

Ответ 13

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

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

Не забудьте поставить $user в одинарные кавычки.

Ответ 14

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

Ответ 15

Насколько я знаю в MS-SQL 2000/5. В прошлом я обманывал это.

Ответ 16

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

Ответ 17

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

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

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

Ответ 18

попробуйте выполнить свою задачу, используя условие IN или ИЛИ, а также этот запрос работает над 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';