Respuestas:
SQL se evalúa al revés, de derecha a izquierda. Entonces, la cláusula where se analiza y evalúa antes de la cláusula select. Debido a esto, el aliasing de u_name a user_name aún no se ha producido.
Consulte la siguiente página del manual de MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html
"A select_expr se le puede dar un alias usando AS alias_name. El alias se usa como el nombre de columna de la expresión y se puede usar en las cláusulas GROUP BY, ORDER BY o HAVING".
(...)
No está permitido hacer referencia a un alias de columna en una cláusula WHERE, porque el valor de la columna aún no se puede determinar cuando se ejecuta la cláusula WHERE. Consulte la Sección B.5.4.4, "Problemas con los alias de columna".
select u_name as user_name from users where u_name = "john";
Piénselo de esta manera, su cláusula where se evalúa primero, para determinar qué filas (o filas unidas) deben devolverse. Una vez que se ejecuta la cláusula where, se ejecuta la cláusula select.
Para decirlo mejor, imagine esto:
select distinct(u_name) as user_name from users where u_name = "john";
No se puede hacer referencia a la primera mitad sin la segunda. Donde siempre se evalúa primero, luego la cláusula select.
Si está intentando realizar una consulta como la siguiente (encuentre todos los nodos con al menos un archivo adjunto) donde ha utilizado una instrucción SELECT para crear un nuevo campo que en realidad no existe en la base de datos, e intente usar el alias para ese resultado te encontrarás con el mismo problema:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
Obtendrá un error "Columna desconocida 'attachcount' en la cláusula WHERE".
La solución es bastante simple: simplemente reemplace el alias con la declaración que produce el alias, por ejemplo:
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;
Todavía obtendrá el alias devuelto, pero ahora SQL no debería molestar al alias desconocido.
(
en su consulta antes de (COUNT(*)
que no esté cerrado en ningún lado.
Su definición alias
no es bienvenida por la WHERE
cláusula que tiene que usar la HAVING
cláusula para esto
SELECT u_name AS user_name FROM users HAVING user_name = "john";
O puede usar directamente el nombre de la columna original con el WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Igual que tiene el resultado en un alias definido por el usuario como resultado de una subconsulta o cualquier cálculo, la HAVING
cláusula no accederá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'
Ya sea:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
o:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
El último debería ser el mismo que el primero si el RDBMS admite la inserción de predicados en la vista en línea.
corregido:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
No, debe seleccionarlo con el nombre correcto. Sin embargo, si proporcionó la tabla que seleccionó de un alias, puede usarla.
No, no puedes. user_name es no existe hasta el tiempo de retorno.
Columna desconocida en la WHERE
cláusula causada por las líneas 1 y 2 y resuelta por la línea 3:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Puede ser de ayuda.
Usted puede
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Funciona.
¡PERO ASEGÚRESE DE LO QUE HACE!
Pero, puede ser útil en algunos casos
Si bien puede alias sus tablas dentro de su consulta (es decir, "SELECCIONE u.nombredeusuario DE usuarios u;"), debe usar los nombres reales de las columnas a las que hace referencia. AS solo afecta cómo se devuelven los campos.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Acabo de tener este problema.
Asegúrese de que no haya espacio en el nombre de la entidad en la base de datos.
por ejemplo, 'nombre_usuario' en lugar de 'nombre_usuario'
intente su tarea usando la condición IN u OR y también esta consulta está trabajando en spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
o
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Tuve el mismo problema, lo encontré útil.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
recuerde poner $ user en '' comillas simples.