条款中的未知栏目

时间:2008-09-30 15:37:17

标签: mysql sql mysql-error-1054

我有一个简单的查询:

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'吗?

18 个答案:

答案 0 :(得分:78)

从右到左向后计算SQL。因此,在select子句之前解析和评估where子句。因此,尚未发生u_name到user_name的别名。

答案 1 :(得分:32)

请参阅以下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节“列的问题   别名”。

答案 2 :(得分:31)

怎么样:

SELECT u_name AS user_name FROM users HAVING user_name = "john";

答案 3 :(得分:12)

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子句。

答案 4 :(得分:10)

如果您尝试执行以下查询(查找具有至少一个附件的所有节点),您使用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不应该使用未知别名。

答案 5 :(得分:6)

或者:

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支持谓词推入内联视图,后者应该与前者相同。

答案 6 :(得分:6)

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'

答案 7 :(得分:5)

不需要使用正确的名称选择它。如果你给了表,你可以从别名中选择,但是你可以使用它。

答案 8 :(得分:5)

校正:

SELECT u_name AS user_name FROM users WHERE u_name = 'john';

答案 9 :(得分:3)

不,你不能。 user_name在返回时间之前不存在。

答案 10 :(得分:2)

第1行和第2行引起的WHERE子句中的未知列,并由第3行解析:

  1. $sql = "SELECT * FROM users WHERE username =".$userName;
  2. $sql = "SELECT * FROM users WHERE username =".$userName."";
  3. $sql = "SELECT * FROM users WHERE username ='".$userName."'";

答案 11 :(得分:1)

刚出现这个问题。

确保数据库中实体名称中没有空格。

e.g。 ' USER_NAME'而不是' user_name'

答案 12 :(得分:1)

可能有帮助。

你可以

SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";

有效。

但请确认你做了什么!

  • 此处未使用索引
  • 将扫描FULL TABLE - 您尚未指定LIMIT 1部分
  • 所以, - 这个查询将在巨大的桌子上滚动。

但是,在某些情况下可能会有所帮助

答案 13 :(得分:0)

使用 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';

答案 14 :(得分:0)

我遇到了同样的问题,我觉得这很有用。

mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");

记得把$ user放在''单引号中。

答案 15 :(得分:0)

SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"

答案 16 :(得分:0)

据我所知,在MS-SQL 2000/5中。我过去曾犯过这种罪行。

答案 17 :(得分:0)

虽然您可以在查询中对表进行别名(即“SELECT u.username FROM users u;”),但您必须使用您引用的列的实际名称。 AS仅影响字段的返回方式。