Відповіді:
SQL оцінюється назад, справа наліво. Тож пункт де проаналізований і оцінюється до вибору. Через це дозволу u_name до user_name ще не відбулося.
Дивіться таку сторінку керівництва MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html
"Вибраному_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";
Подумайте про це так: ваш пункт де оцінюється спочатку, щоб визначити, які рядки (або об'єднані рядки) потрібно повернути. Після того, як виконується пропозиція де, за цим пунктом виконується пункт select.
Якщо говорити краще, уявіть собі це:
select distinct(u_name) as user_name from users where u_name = "john";
Ви не можете посилатися на перший тайм без другого. Там, де завжди спочатку оцінюється, тоді пункт вибору.
Якщо ви намагаєтеся виконати такий запит, як наступний (знайдіть усі вузли принаймні з одним вкладенням), де ви використовували оператор SELECT для створення нового поля, яке фактично не існує в базі даних, і спробуйте використовувати псевдонім для цього результату ви зіткнетеся з тією ж проблемою:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
Ви отримаєте помилку "Невідомий стовпець" додаток "у пункті 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";
Останні повинні бути такими ж, як і перші, якщо RDBMS підтримує натискання предикатами на внутрішній вигляд.
виправлено:
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"
Просто була ця проблема.
Переконайтесь, що в базі даних немає місця в назві об'єкта.
наприклад, "ім'я користувача" замість "ім'я користувача"
спробуйте своє завдання, використовуючи умову 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';
У мене була така ж проблема, я вважав це корисним.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
не забудьте поставити $ user у "" котирування.