2012-04-26 100 views
0

有一個傳統的LAMP應用程序,我在轉換到JVM的過程很。MySQL的:單柱SUM(IF(條件A,B))與穆蒂列求和()

所討論的問題需要用@ 250K記錄的評分表。目前,「scoreType」列表示爲tinyint,其中1 =目標,2 = assist1,3 = assist2。

對於得分領袖,得到目標/ assist1/assist2總計爲每個玩家,查詢片段是這樣的:

SUM(IF(scoreType=1,1,0)) AS goals, SUM(IF(scoreType=2,1,IF(scoreType=3,1,0))) AS assists 

很公平,沒有工作,但我來講想,如果,綜合圖設計,其中查詢上下文將需要SUM,COUNT等操作,最好是打出來的有限的選擇套狀目標/ assist1/assist2,贏/輸/平局,等進入單獨的列而不是TINYINT的方法呢?

在單獨列上查詢就變成了:

SUM(goal) AS goal, SUM(assist1) AS assist1, SUM(assist2) AS assist2 

這是一個雙贏的性能(無需如果(條件A,B)的比賽)在略微增加了存儲成本(3列與1)。

在應用層中的一個潛在的大贏從ORM不支持的SUM移動(如果())來column.Sum();否則,我需要保持非靜態類型的字符串的SQL查詢與所有功能於一身的列方法

的思考?您將如何解決,保持原樣,或將數據庫和應用程序代碼遷移到3列方法?

感謝您的反饋!

回答

1
SELECT scoreType, COUNT(scoreType) 
FROM ... 
GROUP BY scoreType 

不是嗎?


對於誠實定時來比較的替代,使用了更詳細;

SELECT COUNT(CASE WHEN scoreType = 1 THEN id ELSE NULL END) AS goals, 
     ... 
+0

感謝,就像我說的,進球和助攻在語義上的不同。例如,得分領導者可以按目標排序,asisst1,assist2。 ORDER BY目標如何使用scoreType?此外,看起來像你的查詢返回3行每個球員,而不是1 – virtualeyes 2012-04-26 12:34:12

+0

好吧,我只是想知道是否有其他結構化的解決方案不會更合適。 – 2012-04-26 12:38:07

+0

+1是的,我看的LAMP應用程序越多,我認爲它就需要進行嚴重的重組;應該提到這項運動是冰球;因此assist1,assist2(不同於橄欖球/單一助攻的足球) – virtualeyes 2012-04-26 12:43:21