在查询中再次使用聚合函数值

时间:2019-05-30 23:07:26

标签: mysql jpa count aggregate-functions

我想在great()的同一查询中使用count()的值。有办法吗?

我尝试将count(id)用作my_count,最大为(my_count,7),但它给出了错误:
ERROR 1054 (42S22): Unknown column 'my_count' in 'field list'

如果我使用greatest(count(id), 7)会增加查询时间吗?
我也可以在JPA @Query中做同样的事情吗?

1 个答案:

答案 0 :(得分:1)

您不能在同一SELECT中使用SELECT的别名,子查询的SELECT的别名可以在外部查询中使用。我不确定MySQL是否可以在一次选择中优化多个相同的COUNT表达式,但我希望如此。

当我真的很担心需要两次相同的表达式,以及重复它可能对性能产生的影响(或更常见的是,重复冗长的表达式对可读性/可维护性的影响)时,我发现转向“主”查询进入子查询,并在包装​​查询中重复使用别名会有所帮助。

一般形式是这样的

SELECT stuff, long_equation AS r1, long_equation_with_extra_operations AS r2 FROM tables

成为

SELECT mainQ.*, r1_with_extra_operations AS r2
FROM (SELECT stuff, long_equation AS r1 FROM tables) AS mainQ

对于这个问题的特殊情况,以下是上述策略的应用:

SELECT my_count, GREATEST(my_count, 7) 
FROM (SELECT COUNT(*) AS my_count ....) AS mainQ

注意:子查询显然将必须包含“额外操作”部分中使用的任何字段,因此,根据原始查询的具体情况,此策略并非总是可行的,或者至少可能不是那么简单易用。 / p>

({GREATEST,在SELECT表达式中,对性能的影响应该很小;它与CASE WHEN a IS NULL OR b IS NULL THEN NULL WHEN a > b THEN a ELSE b END等效。但是,在WHERE或ON子句中使用它可能会严重损害性能,因为MySQL无法在这种情况下,无法利用字段索引。