stop 未知任务 mysql_mysql - Where子句中的未知列

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值