未知列在哪里条款
我有一个简单的查询:
SELECT u_name AS user_name FROM users WHERE user_name = "john";
Unknown Column 'user_name' in where clause
我得到了Unknown Column 'user_name' in where clause
。 即使在select 'u_name as user_name'
之后,我是否可以不在语句的其他部分引用'user_name'
select 'u_name as user_name'
?
SQL是从右向左评估的。 所以where子句在select子句之前被parsing和评估。 因此u_name到user_name的别名尚未发生。
请参阅以下MySQL手册页面: http : //dev.mysql.com/doc/refman/5.0/en/select.html
“select_expr可以使用AS alias_name给别名,别名用作expression式的列名,可以在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条款。
如果您尝试执行类似以下的查询(查找所有具有至less一个附件的节点),那么您已经使用SELECT语句创build了实际上不存在于数据库中的新字段,并尝试使用该结果的别名会遇到同样的问题:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) AS attachmentcount FROM nodes WHERE attachmentcount > 0;
你会在WHERE子句中得到一个错误“Unknown column'attachmentcount'”。
解决scheme实际上相当简单 – 只需用生成别名的语句replace别名,例如:
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'
不,你需要select正确的名字。 如果你给了你从一个别名中select的表,你可以使用它。
你不能。 user_name在返回时间之前不存在。
第1行和第2行引起的WHERE
子句中的未知列,第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";
有用。
但请确定你做了什么!
- 这里没有使用索引
- 将会扫描FULL TABLE – 您没有指定LIMIT 1部分
- 所以, – 这个查询将是巨大的桌子上SLLLOOOOOOW。
但是,在某些情况下可能会有所帮助
我有同样的问题,我发现这很有用。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$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条件或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';