2013-04-16 45 views
0

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

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) 

目标是与主要的累加返回数(S),其累积

是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 

在此先感谢。

+0

为什么有人会投这个问题呢?我认为他只是需要一个建议来优化他的查询 –

+0

完全同意;) –

回答

1

该子查询只执行一次,而你没有与创建任何预先查询打扰工作因为其他答案可能会建议(虽然这样做仍然正确,只是不需要)。数据库引擎会意识到,子查询没有使用任何依赖查询其他部分的变量。您可以使用EXPLAIN来查看查询的执行方式。

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

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 
+0

感谢您的提示,但在我看来,表格需要被搜索两次,这是无法避免的? –

+0

Wao,17.1K,你一定很好,如果你有时间,请看看其他问题的评论;)可能是你可以帮助我们。谢谢。 –

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

希望这会为你

+0

Uff,我只是测试它并返回'空集',删除HAVING部分返回一组。在我看来,MySQL并不喜欢总数= MAX(总数)的技巧。任何想法?再次感谢。 –

+0

事实上,似乎任何一个查询如此简单,就像'SELECT a,count FROM table1 HAVING count = MAX(count)'不起作用。这就是'解决'的问题,如果这样做的话,可能更好的解决方案可能是:'SELECT a,SUM(count)total FROM table1 HAVING total = MAX(total)' –

+0

因此,你是否试过' SELECT a,SUM(count)作为total FROM table1 HAVING total = MAX(total)'?我认为它会正常工作 –

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的只是一个添即该查询已经过测试。

+0

这与@DRapp查询结构相似,并且具有相同的问题:1-对于某些数据示例(其中'a'字段是唯一的或重复少的字段)几乎等同于执行两个查询。 2-对于需要的情况,如果table1有更多的字段或存在与其他表相关的其他字段,那么对于需要得到的情况而言,得到的结果总数不会超过“a”。除此之外,特别是这种解决方案失去了分页。托马斯说了一些有趣的事情。如果这是真的,最好的查询必须非常喜欢我写的内容,由于可读性,我只想在分配她的回复之前先测试。谢谢。 –