mysql - Where子句中的未知列
我有一个简单的查询:
SELECT u_name AS user_name FROM users WHERE user_name = "john";
我收到Unknown Column 'user_name' in where clause.即使在select 'u_name as user_name'之后,我还能在声明的其他部分参考'user_name'吗?
18个解决方案
77 votes
SQL从右到左向后评估。 因此,在select子句之前解析和评估where子句。 因此,尚未发生u_name到user_name的别名。
dacracot answered 2019-07-31T05:56:07Z
32 votes
请参阅以下MySQL手册页:[http://dev.mysql.com/doc/refman/5.0/en/select.html]
“select_expr可以被赋予别名 使用AS alias_name。 使用别名 作为表达式的列名和 可以在GROUP BY,ORDER BY或。中使用 有条款。“
(......)
不允许在WHERE子句中引用列别名, 因为WHERE时可能尚未确定列值 子句被执行。 请参见第B.5.4.4节“列的问题 别名”。
Paul Dixon answered 2019-07-31T05:56:51Z
31 votes
关于什么:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
Septimus answered 2019-07-31T05:57:11Z
12 votes
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子句。
Mark S. answered 2019-07-31T05:57:53Z
10 votes
如果您尝试执行如下所示的查询(查找具有至少一个附件的所有节点),您使用SELECT语句创建一个实际上不存在于数据库中的新字段,并尝试使用 该结果的别名你将遇到同样的问题:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
您将在WHERE子句中收到错误“未知列'attachmentcount'”。
解决方案实际上非常简单 - 只需用产生别名的语句替换别名,例如:
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不应该使用未知别名。
Jon answered 2019-07-31T05:58:40Z
6 votes
或者:
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支持谓词推入内联视图,后者应该与前者相同。
David Aldridge answered 2019-07-31T05:59:07Z
6 votes
您定义的HAVING不受WHERE条款欢迎您必须使用HAVING条款
SELECT u_name AS user_name FROM users HAVING user_name = "john";
或者您可以直接使用原始列名称与HAVING
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'
M Khalid Junaid answered 2019-07-31T05:59:47Z
5 votes
不需要选择正确的名称。 如果你给了表,你可以从别名中选择,但是你可以使用它。
Per Hornshøj-Schierbeck answered 2019-07-31T06:00:12Z
5 votes
更正:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Steven A. Lowe answered 2019-07-31T06:00:36Z
3 votes
你不能。 user_name在返回时间之前不存在。
Jarrett Meyer answered 2019-07-31T06:01:02Z
2 votes
由第1行和第2行引起并由第3行解析的$sql = "SELECT * FROM users WHERE username ='".$userName."'";子句中的未知列:
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
oliyide answered 2019-07-31T06:01:40Z
1 votes
可能有帮助。
您可以
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
有用。
但请确认你做了什么!
这里不使用索引
将扫描FULL TABLE - 您尚未指定LIMIT 1部分
所以, - 这个查询将在巨大的桌子上下降。
但是,在某些情况下可能会有所帮助
F_S answered 2019-07-31T06:02:45Z
1 votes
刚出现这个问题。
确保数据库中实体名称中没有空格。
例如 'user_name'而不是'user_name'
user3103155 answered 2019-07-31T06:03:19Z
0 votes
虽然您可以在查询中对表进行别名(即“SELECT u.username FROM users u;”),但您必须使用您引用的列的实际名称。 AS仅影响字段的返回方式。
Blumer answered 2019-07-31T06:03:47Z
0 votes
不是我在MS-SQL 2000/5中所知道的。 我过去曾犯过这种罪行。
Cirieno answered 2019-07-31T06:04:13Z
0 votes
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Jason Plank answered 2019-07-31T06:04:31Z
0 votes
我有同样的问题,我觉得这很有用。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
记得把$ user放在''单引号中。
devWaleed answered 2019-07-31T06:05:04Z
0 votes
使用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';
KARTHIKEYAN.A answered 2019-07-31T06:05:30Z