Ответ 1
SQL вычисляется в обратном порядке, справа налево. Таким образом, выражение where анализируется и оценивается перед предложением select. Из-за этого псевдоним u_name для user_name еще не произошло.
У меня есть простой запрос:
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'
?
SQL вычисляется в обратном порядке, справа налево. Таким образом, выражение where анализируется и оценивается перед предложением select. Из-за этого псевдоним u_name для user_name еще не произошло.
См. следующую страницу руководства MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html
"При выборе select_expr может быть задан псевдоним используя AS alias_name. Используется псевдоним как имя столбца выражения и может использоваться в GROUP BY, ORDER BY или HAVING."
Как насчет:
SELECT u_name AS user_name FROM users HAVING user_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 для создания нового поля, которое фактически не существует в базе данных, и попробуйте использовать псевдоним для этого результата, вы столкнетесь с той же проблемой:
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 не должен биться с неизвестным псевдонимом.
Или:
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 поддерживает предикат, нажав на потоковое представление.
исправлено:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Ваш выделенный 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 не существует до времени возврата.
Неизвестный столбец в выражении 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."'";
Может быть, это помогает.
Вы можете
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Он работает.
НО УБЕДИТЕСЬ, ЧТО ВЫ ДЕЛАЕТЕ!
Но может быть, это помогает в некоторых случаях
У меня была та же проблема, я нашел это полезным.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
Не забудьте поставить $user в одинарные кавычки.
Хотя вы можете псевдонизировать свои таблицы в своем запросе (т.е. "SELECT u.username FROM users u;" ), вы должны использовать фактические имена столбцов, на которые вы ссылаетесь. AS влияет только на то, как возвращаются поля.
Насколько я знаю в MS-SQL 2000/5. В прошлом я обманывал это.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Просто эта проблема.
Убедитесь, что в имени объекта в базе данных нет пробела.
например. 'user_name' вместо 'user_name'
попробуйте выполнить свою задачу, используя условие 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';