在数据库上执行计算

时间:2015-03-24 20:25:29

标签: php mysql relational-database relationship table-relationships

我有一些包含一些示例数据的数据库设置。我在一张桌子上有很多球队,而在另一张桌子上有另外一组球员我已经为他们已经打过的比赛得分了。我正在努力计算他们的胜利和亏损的逻辑。我应该在更新结果时更新结果(在灯具表中),或者根据灯具表中的分数计算它。我不愿意第一种方式,因为它可能是重复数据,但无法弄清楚如何计算它的逻辑。你可能会说这是我用过的第一个关于表之间关系的数据库。

relavent section on er diagram

我正在尝试将上表中的数据呈现到联赛表中。为了获得积分,我需要计算赢/输/丢失的比赛,这就是我无法弄清楚该怎么做(计算主队出局的数据等等)

如果我可以从灯具表中计算,我会删除团队中的大多数cols。

1 个答案:

答案 0 :(得分:1)

与各种风格的运动球有关的数据集和计算令人惊讶地复杂。我已经编写了基于竞技场可用性生成夹具时间表的代码,但这并不好玩。

无论如何,为了生成你想要的报告而不重复数据,下面的应该工作,尽管我还没有能够测试它。

SELECT t.team_name,
    hr.home_win, hr.home_loss, hr.home_draw,
    ar.away_win, ar.away_loss, ar.away_draw
FROM teams t
    -- home record
    INNER JOIN (
        SELECT home_team AS 'team_name',
            SUM(IF(home_team_score>away_team_score,1,0)) AS 'home_win',
            SUM(IF(home_team_score<away_team_score,1,0)) AS 'home_loss',
            SUM(IF(home_team_score=away_team_score,1,0)) AS 'home_draw'
        FROM fixtures
        GROUP BY home_team
    ) hr ON t.team_name = hr.team_name
    -- away record
    INNER JOIN (
        SELECT away_team AS 'team_name',
            SUM(IF(home_team_score<away_team_score,1,0)) AS 'away_win',
            SUM(IF(home_team_score>away_team_score,1,0)) AS 'away_loss',
            SUM(IF(home_team_score=away_team_score,1,0)) AS 'away_draw'
        FROM fixtures
        GROUP BY away_team
    ) ar ON t.team_name = ar.team_name

现在,一个普通的 RDBMS只会使用COUNT(scoreA>scoreB),但由于这是MySQL,我不得不用SUM(IF())来捏造它。 fiddle

假设你不会拥有数千个团队,那么这个团队应该能够很好地扩展。