Ответы:
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».
(...)
Недопустимо ссылаться на псевдоним столбца в предложении WHERE, потому что значение столбца может еще не быть определено при выполнении предложения WHERE. См. Раздел B.5.4.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.
Если вы пытаетесь выполнить следующий запрос (найти все узлы с хотя бы одним вложением), в котором вы использовали оператор 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 не должен работать с неизвестным псевдонимом.
(
в вашем запросе есть лишнее, (COUNT(*)
которое нигде не закрывается.
Ваше определение 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'
Либо:
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';
Нет, вам нужно выбрать его с правильным именем. Если вы указали выбранную таблицу из псевдонима, вы можете использовать это.
Нет, ты не можешь. 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";
Оно работает.
НО УБЕДИТЕСЬ, ЧТО ВЫ ДЕЛАЕТЕ!
Но, может быть, в некоторых случаях это помогает
Хотя вы можете использовать псевдонимы для своих таблиц в запросе (например, «SELECT u.username FROM users u;»), вы должны использовать фактические имена столбцов, на которые вы ссылаетесь. AS влияет только на то, как возвращаются поля.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Просто была эта проблема.
Убедитесь, что в имени объекта в базе данных нет места.
например, user_name вместо user_name
попробуйте свою задачу, используя условие IN или условие OR, а также этот запрос работает с 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';
У меня была такая же проблема, я нашел это полезным.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
не забудьте заключить $ user в одинарные кавычки.