SQL查询通过在where子句中添加两列?

时间:2014-01-25 17:43:36

标签: mysql sql

我有一个包含两个分数的数据库表:

  • scoreA
  • scoreB

我试图通过添加这两个值来创建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的唯一方法,如果它是唯一的解决方案,我也很好。感谢。

7 个答案:

答案 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;

Fiddle here

答案 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)