未知列在哪里条款

我有一个简单的查询:

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行解决:

  1. $sql = "SELECT * FROM users WHERE username =".$userName;
  2. $sql = "SELECT * FROM users WHERE username =".$userName."";
  3. $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';