WHERE与ORDER中使用聚合函数报错‘Unknown column userpoints’求助
解决SQL中"Unknown column userpoints"的问题
这个坑我之前踩过!报错的原因很明确:你在WHERE子句里引用了聚合函数生成的别名userpoints,但SQL的执行顺序不允许这么做。
为什么会报错?
SQL的执行流程是这样的:
- 先执行
FROM和JOIN关联表 - 然后用
WHERE过滤原始行(这时候还没做分组和聚合计算,userpoints这个别名对应的结果根本还没生成) - 接着才是
GROUP BY分组,再计算SUM(points)得到userpoints - 之后才会执行
HAVING、ORDER BY这些针对分组结果的操作
所以在WHERE阶段,数据库根本不知道userpoints是什么,自然会报“未知列”的错误。
正确的SQL写法
你需要把针对聚合结果的过滤条件放到HAVING子句里(HAVING是专门用来过滤分组后结果的),修改后的语句如下:
SELECT TOP 1 [name], SUM(user_activities.points) AS userpoints FROM [users] INNER JOIN [user_activities] ON [users].[id] = [user_activities].[user_id] GROUP BY [name] HAVING SUM(user_activities.points) < 100 -- 这里替换原来的WHERE条件 ORDER BY userpoints DESC
或者,有些数据库(比如SQL Server)支持在HAVING里直接用聚合别名,你也可以这么写:
SELECT TOP 1 [name], SUM(user_activities.points) AS userpoints FROM [users] INNER JOIN [user_activities] ON [users].[id] = [user_activities].[user_id] GROUP BY [name] HAVING userpoints < 100 ORDER BY userpoints DESC
额外提醒
如果你的数据库是MySQL、PostgreSQL这类,TOP 1要换成LIMIT 1,比如:
SELECT [name], SUM(user_activities.points) AS userpoints FROM [users] INNER JOIN [user_activities] ON [users].[id] = [user_activities].[user_id] GROUP BY [name] HAVING userpoints < 100 ORDER BY userpoints DESC LIMIT 1
这样就能正确查询到积分总和低于100的最高积分用户啦!
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

