4

我需要一些帮助来制作梯子。

继承人的信息:

表:

cricket_teams(id, name)
cricket_matches(id, hometeam, awayteam, format, season, winner)
cricket_teamperformance(id, matchid, team, innings, score)

(表中还有其他字段对于此查询是不必要的)

我需要得到它,以便它给我胜利,平局(获胜者 = 0),失败,FIP(当一支球队在第一局得分更多时),BP(在这种情况下只是获胜)和积分(粗体完成)。我有一个疑问,但我有一些问题。我不知道如何计算平局和失利,也没有赢得一场比赛的球队。这是我所拥有的:

SELECT b.team, 
       b.name, 
       COUNT(c.wins) as W, 
       count(b.name)*2 as FIP, 
       COUNT(c.wins)*2 as BP, 
       COUNT(c.wins)*4+(count(b.name)*2)+(COUNT(c.wins)*2) as Pts
FROM (SELECT a.name, a.score, a.matchid, a.team
      FROM (SELECT cricket_teams.name, score, matchid, team
            FROM `cricket_teamperformance` 
            LEFT JOIN cricket_teams 
                   ON cricket_teamperformance.team = cricket_teams.id
            INNER JOIN cricket_matches 
                   ON cricket_teamperformance.matchid = cricket_matches.id
            WHERE cricket_matches.format=3
              AND cricket_teamperformance.innings = 1
              AND cricket_matches.season = 1
               OR cricket_matches.format=3
              AND cricket_teamperformance.innings = 2
              AND cricket_matches.season = 1
            ORDER BY matchid, score DESC) as a
      GROUP BY matchid) as b, 
     (SELECT COUNT(winner) as wins, cricket_teams.name
      FROM cricket_matches
      LEFT JOIN cricket_teams ON cricket_matches.winner = cricket_teams.id
      WHERE format = 3
      AND season = 1) as c
GROUP BY b.name
ORDER BY Pts DESC

这将返回:

team    name    W   FIP BP  Pts
4   Chargers    2   4   4   16
2   Hawks       1   2   2   8
1   Ninjas      1   2   2   8

它需要看起来像这样(P 是比赛,D 是平局,L 是输球):

team    name    P   W   D   L   FIP BP  Pts
4   Chargers    2   2   0   0   4   4   16
2   Hawks       2   1   0   1   2   2   8
1   Ninjas      2   1   0   1   2   2   8
3   Wolves      2   0   0   2   0   0   0

还有另一支球队,狼队,他们两场比赛都没有赢过。我还需要找回那些平局和损失。提前致谢

*这是多日板球比赛,这意味着球队每场比赛最多可以有两局。SQL 小提琴:http ://sqlfiddle.com/#!2/26e41/2

4

2 回答 2

1

我发现问题描述和表架构非常混乱,但也许这会以某种方式帮助你:

SELECT  ct.id AS TeamID,
        ct.name AS TeamName,
        COUNT(DISTINCT cm.id) AS MatchesPlayed,
        COUNT(DISTINCT CASE WHEN cm.winner = ct.id THEN cm.id END) AS Wins,
        COUNT(DISTINCT CASE WHEN cm.winner = 0 THEN cm.id END) AS Draws,
        COUNT(DISTINCT CASE WHEN cm.winner != 0 AND cm.winner != ct.id THEN cm.id END) AS Losses,
        COUNT(DISTINCT
              CASE
                WHEN (ctph.innings = 1 OR ctpa.innings = 1) 
                      AND (ctph.team = ct.id AND ctph.score > ctpa.score)
                THEN ctph.matchid
                WHEN (ctph.innings = 1 OR ctpa.innings = 1) 
                      AND (ctpa.team = ct.id AND ctpa.score > ctph.score)
                THEN ctpa.matchid
              END) AS FIP
FROM    cricket_teams AS ct
        LEFT JOIN cricket_matches AS cm ON cm.hometeam = ct.id OR cm.awayteam = ct.id
        LEFT JOIN cricket_teamperformance AS ctph ON ctph.team = cm.hometeam AND ctph.matchid = cm.id
        LEFT JOIN cricket_teamperformance AS ctpa ON ctpa.team = cm.awayteam AND ctpa.matchid = cm.id
GROUP BY ct.id, ct.name
于 2013-06-07T04:27:52.970 回答
1

这是一个替代解决方案:

SELECT team,
       name,
       count(*)   AS p,
       sum(win)   AS w,
       sum(draw)  AS d,
       sum(loss)  AS l,
       sum(fi)*2  AS fip,
       sum(win)*2 AS bp,
       sum(win)*4 + sum(fi)*2 + sum(win)*2 AS pts
FROM
  (SELECT t.id AS team,
          t.name,
          m.winner = t.id AS win,
          m.winner = 0    AS draw,
          m.winner <> t.id AND m.winner <> 0 as loss,
          CASE
              WHEN p1.score > p2.score THEN p1.team = t.id
              ELSE p2.team = t.id
          END AS fi
   FROM cricket_matches m,
        cricket_teamperformance p1,
        cricket_teamperformance p2,
        cricket_teams t
   WHERE m.id = p1.matchid
     AND m.id = p2.matchid
     AND p1.innings = 1
     AND p2.innings = 2
     AND (t.id = m.hometeam
          OR t.id = m.awayteam)
     AND m.season = 1
     AND m.format = 3) tallies
GROUP BY team
ORDER BY pts DESC, name
于 2013-06-07T05:30:19.470 回答