我有一个简单的查询:
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'
?
我有一个简单的查询:
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
“A select_expr可以给出使用AS ALIAS_NAME一个别名。别名用作表达式的列名,并且可以在GROUP BY,ORDER BY,或HAVING子句中使用。”
(......)
这是不允许指在WHERE子句中的列别名,因为可能会被执行WHERE子句时,尚未确定列值。 见B.5.4.4节,“问题与列别名”。
关于什么:
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;
你会得到一个错误“未知列‘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不应该博克在未知的别名。
或者:
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支持谓词推入在线视图。
您定义的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';
你不能。 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";
有用。
但要确保你做什么!
不过,可能是它有助于在某些情况下,
只是有这个问题。
确保没有在数据库中的实体的名称没有空格。
例如,“USER_NAME”而不是“USER_NAME”
虽然您可以在查询中的别名表(即“选择u.username来自用户的U;”),你必须使用你所引用的列的实际名称。 因为只有影响的领域是如何返回。
还不如就我所知在MS-SQL 2000/5。 我已经爱上了这个犯规过去。
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
我有同样的问题,我发现这非常有用。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
记得把$用户“”单引号。
试试你的任务使用IN条件或OR条件,也该查询正在火花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';