Answers:
SQL从右到左向后评估。因此,where子句将在select子句之前进行解析和评估。因此,尚未发生u_name到user_name的别名。
关于什么:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
HAVING
而不是WHERE
?
参见下面的MySQL手册页:http : //dev.mysql.com/doc/refman/5.0/en/select.html
“可以使用AS alias_name为select_expr赋予别名。该别名用作表达式的列名,并且可以在GROUP BY,ORDER BY或HAVING子句中使用。”
(...)
不允许在WHERE子句中引用列别名,因为执行WHERE子句时可能尚未确定列值。请参见第B.5.4.4节“列别名的问题”。
如果您尝试执行以下查询(查找所有带有至少一个附件的节点),则在其中使用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不应该对未知的别名感到困惑。
(
在查询中还有一个额外功能,而(COUNT(*)
这个功能在任何地方都无法关闭。
您定义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'
否,您不需要选择正确的名称。如果您为表提供了别名,则可以使用它。
你不能。直到返回时间,user_name才存在。
WHERE
第1行和第2行引起子句中的未知列,并由第3行解决:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
虽然可以在查询中为表加别名(即“ SELECT u.username FROM users u;”),但您必须使用所引用列的实际名称。AS仅影响字段的返回方式。
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
我有同样的问题,我发现这很有用。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
请记住将$ user放在单引号中。