【问题标题】:performing calculations on a database在数据库上执行计算
【发布时间】:2015-03-24 20:25:28
【问题描述】:

我有一个包含一些示例数据的数据库设置。我有很多球队在一张桌子上,他们的比赛在另一张桌子上,我有他们已经玩过的比赛的得分。我正在努力计算他们的输赢的逻辑。我应该在更新结果(在夹具表中)时在团队表中更新它还是从夹具表中的分数计算它。我不愿意采用第一种方式,因为它可能被认为是重复数据,但无法弄清楚如何计算它的逻辑。正如您可能知道的那样,这是我处理过的第一个处理表之间关系的数据库。

我正在尝试将上述表格中的数据呈现到排名表中。为了获得积分,我需要计算比赛的赢/输/输,这就是我不知道该怎么做(计算主队与客队等的次数)

如果我可以从赛程表中计算出来,我会从团队中删除大多数列。

【问题讨论】:

  • 我不确定您的真正问题是什么,但我会稍微阅读一下 SQL。您将希望在 SQL 而不是 PHP 中执行计算。希望这会有所帮助。
  • 将您的测试数据库/数据放入SQLfiddle
  • 感谢 @brs14ku 帮助我编辑了这个问题,希望能增加一些清晰度。
  • @Sammitch 会检查并返回(以前从未使用过)。
  • @Sammitch 我在 sqlfiddle 中遇到此错误 用户 'user_9_3b59f'@'%' 对数据库 'db_Name' 的访问被拒绝

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


【解决方案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&gt;scoreB),但由于这是 MySQL,我不得不用SUM(IF()) 来伪造它。 fiddle

假设您不会拥有数千个团队,这应该可以很好地扩展。

【讨论】:

  • 谢谢,效果很好,尽管它需要在小提琴中注释计数行并取消注释 SUM(IF()) 行才能获得正确的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多