MySQL:单列SUM(IF(cond,a,b))vs多列Sum()

时间:2012-04-26 12:05:32

标签: java mysql sum lamp multiple-columns

有一个传统的LAMP应用程序,我正在转换到JVM。

有问题需要一张带有250K记录的评分表。目前,“scoreType”列表示为tinyint,其中1 = goal,2 = assist1,3 = assist2。

对于得分领先者,要获得每个玩家的goal / assist1 / assist2总计,查询代码段如下:

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

足够公平,完成工作,但我想知道,在一般架构设计方面,查询上下文将需要SUM,COUNT等操作,最好是突破有限的选择设置如目标/辅助1 /辅助2,赢/输/领带等分为单独的列而不是tinyint方法?

在单独的列中,查询变为:

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

性能获胜(不需要if(cond,a,b)匹配),但存储量略有增加(3列对1)。

在应用程序层,一个潜在的大胜利是从ORM不支持的SUM(if())转移到column.Sum();否则,我需要使用一对一的方法保持非静态类型的字符串SQL查询

思考?您将如何解决,保持原样,或将数据库和应用程序代码迁移到3列方法?

感谢您的反馈!

1 个答案:

答案 0 :(得分:1)

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

不是吗?


为了比较替代方案的诚实时间,请使用更详细的;

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