0

是否存在更好的方法来执行以下 SQL 查询的功能?我感觉 table1 将被搜索两次,可能可以通过一些技巧来避免这种情况并提高查询的效率,但我就是不知道如何;(这是查询(在 MySQL 中):

SELECT a, SUM(count)
FROM table1
GROUP BY a
HAVING SUM(count) = (SELECT SUM(count) as total FROM table1 GROUP BY a ORDER BY total DESC LIMIT 1)

目标是返回带有主要累加的数字及其累加。

作为 table1 两个字段表,如:

a,count
1,10
1,30
1,0
2,1
2,100
2,4
3,10
4,50
4,55

该数据样本的结果是:

2,105
4,105

提前致谢。

4

4 回答 4

3
SELECT a, total FROM 
(SELECT a AS a, SUM(COUNT) AS total
FROM table1
GROUP BY a) AS xyz 
HAVING total = MAX(total)

希望这对你有用

于 2013-04-16T02:51:05.480 回答
0

此查询返回包含两列的一行:

1-“a”列的逗号分隔值列表,其中具有最大的“Total”

2- 和最大的总价值

select group_concat(a), Total
from
(select a, sum(count) as Total
from table1
group by a) OnTableQuery
group by Total
order by Total desc
limit 1

请注意,它只查询 table1 一次。该查询已经过测试。

于 2013-04-16T10:34:39.163 回答
0

我认为您可以通过将您的 HAVING 子选择查询移动到其预查询中来做到这一点。由于它将始终包含一行,因此您不需要任何“JOIN”,并且每次应用 HAVING 时都不必继续重新计算 COUNT(*)。做一次,然后剩下的

SELECT 
      a, 
      SUM(count)
   FROM 
      table1,
      ( SELECT SUM(count) as total 
           FROM table1 
           GROUP BY a 
           ORDER BY total DESC 
           LIMIT 1 ) PreQuery
   GROUP BY 
      a
   HAVING 
      SUM(count) = PreQuery.Total
于 2013-04-16T02:49:11.847 回答
0

此子查询仅执行一次,您不必费心创建任何预查询,因为其他答案可能会建议(尽管这样做仍然是正确的,只是不需要)。数据库引擎将意识到,子查询没有使用任何依赖于查询其他部分的变量。您可以使用EXPLAIN来查看查询是如何执行的。

更多关于这个答案的主题: https ://stackoverflow.com/a/658954/1821029

于 2013-04-16T05:02:37.477 回答