2012-04-12 193 views
0

我想排序我的結果,但我的順序聲明被忽略...我明白爲什麼,但不是如何解決它。這裏是我的代碼:MYSQL GROUP BY/ORDER BY confusion

SELECT 
    result.station_id as 'Station ID', 
    result.date as 'Date', 
    result.id as 'ID', 
    COALESCE(sum(if(result.parameter = '1', result.result, NULL)),'-') as 'RESULT A)', 
    COALESCE(sum(if(result.parameter = '2', result.result, NULL)),'-') as 'RESULT B)', 
FROM ( 
    SELECT 
     event.station_id, 
     event.date, 
     event.id, 
     e_result.result 
    FROM event 
    Inner Join e_result ON e_result.id = event.id 
    WHERE 
     (event.station_id = '0001') AND `devent`.`date` >= '1999-02-08' AND `event`.`date` <= '2011-12-20') as result 
GROUP BY by result.id 
ORDER BY 
    result.station_id ASC, 
    result.date DESC 

這是正確的分組,但沒有排序結果後...似乎是整理分組。我需要的分組完成後排序的整個結果集(而不是每個分組)

輸出示例:

Station Date  ID   Result A Result B 
20  7/6/2009 g003  -   3 
12  2/8/1999 g000  19.2  - 
12  2/8/1999 g001  19.9  - 
12  2/14/1999 g002  19.1  - 
17  4/9/2003 i001  22.2  4 

應該

Station Date  ID   Result A Result B 
12  2/14/1999 g002  19.1  - 
12  2/8/1999 g000  19.2  - 
12  2/8/1999 g001  19.9  - 
17  4/9/2003 i001  22.2  4 
20  7/6/2009 g003  -   3 

表:

e_result id, parameter, result 
    g002, 1, 19.1 
    g000, 1, 19.2 
    g001, 1, 19.9 
    i001, 1, 22.2 
    i001, 2, 4 
    g003, 2, 3 

event  station_id, date, id 
    20, 7/16/2009, g003 
    12, 2/8/1999, g000 
    12, 2/8/1999, g001 
    12, 2/14/1999, g002 
    17, 4/9/2003, i001 
+0

向我們展示了一些輸出,你覺得是不正確排序。通常,在生成結果集後,最後會應用ORDER BY子句,因此不清楚你要問什麼。 – 2012-04-12 15:03:23

+0

@MikeRyan我認爲他們希望在分組之前完成ORDER BY – Taryn 2012-04-12 15:12:40

+0

這並不完全正確地回答你的問題,但可能會有所幫助 - 使用圖形查詢構建器將使在mysql中構建如此複雜的查詢變得容易很多而不會出錯。看看這篇文章在SO - http://stackoverflow.com/questions/2506610/visual-query-builder – 2012-04-12 15:14:52

回答

1

我已將您的查詢放入sqlfiddle,但必須做大量調整才能使其正常工作。

這裏是產生結果的查詢你想要的:

select result.station_id as 'Station ID', 
    date_format(result.date,'%c/%m/%Y') as 'Date', 
    result.id as 'ID', 
    if (sum(if(result.parameter = 1, result.result,0)) = 0, 
     null, 
     sum(if(result.parameter = 1, result.result,0))) as 'RESULT A)', 
    if (sum(if(result.parameter = 2, result.result,0)) = 0, 
     null, 
     sum(if(result.parameter = 2, result.result,0))) as 'RESULT B)' 
from 
     (SELECT 
     event.station_id, 
     event.date, 
     event.id, 
     e_result.result, 
     e_result.parameter 
     FROM event 
     Inner join e_result ON e_result.id = event.id) as result 
group by 
    result.station_id, result.date, result.id 
order by 
    result.station_id ASC, 
    result.date DESC; 

我返工聚結,我取消了對內部表結果的where子句,糾正了「devent」錯別字,添加參數字段來內表。和其他一些東西

這給:

STATION ID DATE   ID  RESULT A RESULT B 
12   2/02/1999 g002 19.1  
12   2/02/1999 g000 19.2  
12   2/02/1999 g001 19.9  
17   4/04/2003 i001 22.2  4 
20   7/07/2009 g003    3 

這一切都在這裏:http://sqlfiddle.com/#!2/34d87/17

+0

謝謝......抱歉錯別字等......這是真實查詢的精簡版本,但您的解決方案有幫助!再次感謝! – 2012-04-12 20:13:57

0

你查詢很好,但最後還是缺少最後一個功能:

GROUP BY 
result.station_id 
1

嗯,我可以看到你不明白group by如何工作。當你分組時,你丟失了單獨的記錄,並將它們放在一個包中,這允許您執行聚合函數,如countsum等。因此,根據經驗,如果選擇非聚合字段,那麼你應該把它放在group by條款中。

在你的例子中,你沒有使用任何聚合函數,所以你爲什麼要分組?

此外,你有數據類型的問題。您的查詢中的station_id似乎是一個字符串,而在輸出中似乎是一個整數。另一種方式發生在你的日期。我敢打賭,你正在使用字符字段而不是這些字段的適當數據類型,並且你將它們作爲字符字段排序。

+0

該小組按照預期將事件結果分組。是的,數據不是正確的類型......我既沒有設置它,現在也不能改變它。 – 2012-04-12 16:23:30