【问题标题】:Using aggregate function value again in the query在查询中再次使用聚合函数值
【发布时间】:2019-10-16 14:38:20
【问题描述】:

我想在 best() 内的同一查询中使用 count() 的值。有没有办法做到这一点?

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

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

【问题讨论】:

  • 您不能在 SELECT 中使用 SELECT 中的别名,我不知道 MySQL 是否会在单个选择中优化多个相同的 COUNT 表达式,但我希望如此。当我真的很担心需要两次相同的表达式时,我将“主”查询变成了子查询,并在包装​​查询中重复使用别名。像这样:SELECT my_count, GREATEST(my_count, 7) FROM (SELECT COUNT(*) AS my_count ....) AS mainQ
  • @Uueerdo 你真的应该把它作为答案发布......
  • 谢谢@Uueerdo。我真的很感激这个答案。但是有没有办法在 JPA 中做到这一点?我是新手。我将在编辑后的问题中添加相关标签。我的坏
  • 我认为GREATEST(COUNT(*), 7) 不应该有任何成本。你没有做任何事情两次。
  • @Nick 是的,当我有“我不知道”这样的表达时,我会犹豫。

标签: mysql jpa count aggregate-functions


【解决方案1】:

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

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

一般来说,是这样的

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

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

(GREATEST,在 SELECT 表达式中,应该对性能影响很小;它相当于 CASE WHEN a IS NULL OR b IS NULL THEN NULL WHEN a > b THEN a ELSE b END。但是,在 WHERE 或 ON 子句中使用它可能会显着降低性能,因为 MySQL 无法利用这种情况下的字段索引。

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 2017-12-23
    • 2020-03-09
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多