高效的以下SQL查询?

时间:2013-04-16 02:41:35

标签: mysql sql performance database-performance

是否有更好的方法来执行以下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 个答案:

答案 0 :(得分:4)

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

希望这对你有用

答案 1 :(得分:1)

我认为您可以通过将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

答案 2 :(得分:1)

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

有关此答案中的主题的更多信息: https://stackoverflow.com/a/658954/1821029

答案 3 :(得分:1)

此查询返回一行,其中包含两列:

1-“a”列的逗号分隔值列表,其中包含最大的“总计”

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。该查询已经过测试。