我有一个包含两个分数的数据库表:
我试图通过添加这两个值来创建SQL查询,例如
SELECT *,(scoreA+scoreB) as scoreC FROM data WHERE scoreC > 100 ORDER BY scoreC DESC
但是,它显示错误:
ERROR: Unknown column 'scoreC' in 'where clause'
有没有办法解决这个问题?
P.S。我没有为scoreC添加新列的原因是因为scoreA / scoreB被其他cron作业连续更新,如果我想计算scoreC,我需要为scoreC做额外的查询/更新,我想避免节省系统资源。但是,如果它是另一个cron作业计算scoreC的唯一方法,如果它是唯一的解决方案,我也很好。感谢。
答案 0 :(得分:4)
MySQL支持非标准扩展,允许您在这种情况下使用having
子句:
SELECT *, (scoreA+scoreB) as scoreC
FROM data
HAVING scoreC > 100
ORDER BY scoreC DESC;
让我强调这是特定于MySQL的。对于像这样的简单表达式,我只需将公式放在where
子句中。但有时表达式可能非常复杂 - 例如距离公式或复杂case
或子查询。在这些情况下,having
扩展名实际上很有用。
并且,您不需要order by
子句中的公式。 MySQL允许列别名。
答案 1 :(得分:3)
您不能在where子句中使用派生列ScoreC。但是,您可以这样做:
SELECT *
FROM
(
SELECT *, (scoreA+scoreB) as scoreC
FROM data
) x
WHERE x.ScoreC > 100
ORDER BY x.ScoreC DESC;
答案 2 :(得分:2)
您不能在where和order by中使用计算字段名称,但可以使用公式:
SELECT scorea + scoreb FROM data WHERE scorea+scoreb > 100 order BY scorea+scoreb
您还可以使用字段记分创建视图。
答案 3 :(得分:1)
SELECT *,(scoreA+scoreB) as scoreC
FROM data
WHERE (scoreA+scoreB) > 100
ORDER BY (scoreA+scoreB) DESC
答案 4 :(得分:1)
您可以使用HAVING
子句。
SELECT *,(scoreA+scoreB) as scoreC
FROM data
HAVING scoreC > 100
ORDER BY scoreC DESC;
From documentation: “SQL标准要求HAVING必须仅引用GROUP BY子句中的列或聚合函数中使用的列。但是,MySQL支持此行为的扩展,并允许HAVING引用SELECT列表中的列和外部子查询中的列作为井“。
答案 5 :(得分:1)
您可能正在寻找HAVING子句
SELECT *,(scoreA+scoreB) as scoreC
FROM data HAVING scoreC > 100
ORDER BY scoreC DESC
答案 6 :(得分:0)
现在可以在where子句中添加带有列名的条件
from django.http.request import QueryDict
def product_new(request):
group = request.GET.get('group')
if group == None:
product = Product.objects.create()
return redirect('cms:product_list_edit')
else:
product = Product.objects.create(group=group)
qd = QueryDict(mutable=True)
qd.update(group=group)
return redirect_qd('cms:product_list_edit', qd=qd)