2012-02-28 116 views
1

我從mySQL數據庫中提取了一組評論類型及其總數。結果集看起來像:如何高效地對這個mysql結果進行分組,總結和排序?

ID - NAME - TOTAL
0 - GENERAL - 4
3 - 有意義 - 9
4 - MISC - 5

以我輸出到端但是,我想總結GENERAL和MISC,ID 0和4的總數。我應該如何有效地執行此操作?我看到的問題是,ID 0可能不是每個結果和ID 4相同的東西。

有什麼建議嗎?

我的查詢是:

​​

所以我的最終用戶的結果應該是這樣的:

GENERAL/MISC - 9
有意義 - 9

+0

產生這個問題的查詢是什麼? – 2012-02-28 14:56:09

+0

如果在結果行中不是exixst,那麼TOTAL是0.或者你想要其他的嗎? – Narek 2012-02-28 15:00:51

回答

1

我將使它容易對您和MySQL拆分出來是這樣的:

(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, b.vch_name as NAME 
FROM comments a 
JOIN comments_types b ON a.fk_type_id = b.id 
WHERE a.entry = X AND a.fk_type_id <> 0 AND a.fk_type_id <> 4 
GROUP BY a.fk_type_id) 
UNION ALL 
(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, 'GENERAL/MISC' as NAME 
FROM comments a 
JOIN comments_types b ON a.fk_type_id = b.id 
WHERE a.entry = X AND (a.fk_type_id = 0 OR a.fk_type_id = 4) 
GROUP BY a.fk_type_id) 

我改變了你LEFT JOINJOIN因爲我們只計算一個類型的意見。

你可能會改善查詢,在fk_type_id假設一個索引,通過使「MISC」型「1」,而不是類型「4」,所以你可以不喜歡a.fk_type_id < 2代替(a.fk_type_id = 0 OR a.fk_type_id = 4)和a.fk_type_id > 1,而不是a.fk_type_id <> 0 AND a.fk_type_id <> 4

如果您使用索引而不是掃描行,執行兩個單獨的查詢返回不同的結果不會影響性能。

0

這將總結GENERAL和MISC的多個條目

SELECT SUM(TOTAL) FROM tablename WHERE NAME='GENERAL' OR NAME='MISC'; 
+0

但我還需要返回其他潛在ID。因此,在上面的示例中,我的最終用戶可能會看到GENERAL/MISC - 9,MEANINGFUL - 9 – Mike 2012-02-28 15:00:08

+1

@Mike,那麼爲什麼不執行原始查詢並自己添加General和Misc總計? – Brian 2012-02-28 15:10:25

2

嘗試此查詢 -

SELECT 
    IF(name = 'GENERAL' OR name = 'MISC', 'GENERAL/MISC', name) new_name 
    , SUM(total) 
FROM 
    comments 
GROUP BY 
    new_name 

您可以編寫自定義new_name場。

相關問題