【问题标题】:MySQL: single column SUM(IF(cond,a,b)) vs muti-column Sum()MySQL:单列 SUM(IF(cond,a,b)) 与多列 Sum()
【发布时间】:2012-04-26 12:05:31
【问题描述】:

有一个我正在转换到 JVM 的旧式 LAMP 应用程序。

有问题的问题需要一个包含@250K 记录的评分表。目前,“scoreType”列表示为 tinyint,其中 1 = 目标,2 = 辅助 1,3 = 辅助 2。

对于得分领先者,要获得每个球员的进球/助攻 1/助攻 2 总数,查询 sn-p 如下所示:

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

以略微增加存储空间为代价(3 列对 1 列)以提高性能(不需要 if(cond,a,b) 匹配)。

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

想法?您将如何处理、保持原样或将数据库和应用程序代码迁移到 3 列方法?

感谢您的反馈!

【问题讨论】:

    标签: java mysql sum lamp multiple-columns


    【解决方案1】:
    SELECT scoreType, COUNT(scoreType)
    FROM ...
    GROUP BY scoreType
    

    不会吗?


    如果要准确地比较备选方案,请使用更详细的时间;

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

    【讨论】:

    • 谢谢,就像我说的,进球和助攻在语义上是不同的。例如,得分领先者可按目标、助攻 1、助攻 2 排序。您将如何使用 scoreType 按目标排序?此外,看起来您的查询为每个玩家返回 3 行,而不是 1
    • 好的,我只是想知道其他结构化的解决方案是否更合适。
    • +1 是的,我越看 LAMP 应用程序,我就越认为它需要认真重组 ;-) 应该提到这项运动是冰球;因此助攻1,助攻2(不像足球/足球只有一次助攻)
    • 这不是真正的答案(将分成单独的列),但我懒得自己回答,所以你得到点头 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多