2013-04-16 79 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」。除此之外,特別是這種解決方案失去了分頁。托馬斯說了一些有趣的事情。如果這是真的,最好的查詢必須非常喜歡我寫的內容,由於可讀性,我只想在分配她的回覆之前先測試。謝謝。 –