0

我正在使用 PHP/MySQL 构建曲棍球运动得分和预测系统。下面是系统设计。

我有一个 GAMES 表,其中存在两个团队编号和他们在游戏中的得分。该表中的列如下。

ID ---- TEAM1 ---- SCORE1 ---- TEAM2 ---- SCORE2
1       70         1           73         2
2       74         0           70         1
3       74         0           73         0

我还有一个 PICKS 表,其中包含与用户游戏预测相关的详细信息。用户可以猜测哪支球队将在比赛中获胜,并且该数据存储在此表中。该表中的列如下所示。每个用户每场比赛只能猜一次。

ID ---- GAME ---- USER ---- TEAM ---- POINT
1       1         1         70        1
2       2         1         70        1
3       3         1         73        1
3       1         2         70        1

根据上述可用数据,我正在尝试建立每个用户(USER 列)应为每个正确猜测获得积分(POINT 列)的结果。可以根据 GAMES 表中的分数来验证猜测。最终输出应如下所示。

USER ---- POINTS ---- CORRECT GUESS COUNT ---- WRONG GUESS COUNT
1         1           1                        2
2         0           0                        1

“CORRECT GUESS COUNT”和“WRONG GUESS COUNT”列表示用户猜对和猜错的总数。

我用一些示例数据为上述表创建了一个 SQL Fiddle。

http://sqlfiddle.com/#!2/8d469/4/0

编辑:

  • 更多信息如下。一场比赛有可能是平局。
  • 在这种情况下,每支球队的得分将为 0。当一场比赛被平局时,用户没有得分。
4

2 回答 2

1
SELECT p.user, 
       SUM(IF(g.id IS NOT NULL, p.point, 0)) As points, 
       SUM(IF(g.id IS NOT NULL, 1, 0)) Correct,
       SUM(IF(g.id IS NULL, 1, 0)) Wrong

FROM Games g 
RIGHT JOIN Picks p ON g.id = p.game AND 
          p.team = IF(g.score1 > g.score2 , g.team1, IF(g.score1 < g.score2, g.team2, NULL))
GROUP BY p.user;

SQL Fiddle(使用您的数据)

于 2013-10-08T17:36:56.403 回答
0

如果有比这更多的 MySQL 方法(背景是 Oracle/SQL Server),您将不得不原谅我:

SELECT
  p.user
  ,sum(CASE
     WHEN p.team = g.winner THEN point ELSE 0 END) points
,sum(CASE
     WHEN p.team = g.winner THEN 1 ELSE 0 END) good_guess
,sum(CASE
     WHEN p.team <> g.winner THEN 1 ELSE 0 END) bad_guess
FROM
  picks p
INNER JOIN (
  SELECT
    id game_id
    ,CASE
       WHEN score1 > score2 THEN team1
       WHEN score2 > score1 THEN team2
       ELSE -1 --no team_id as negative
    END winner
    FROM
      games
) g
ON
  g.game_id = p.game
GROUP BY
  p.user
于 2013-10-08T18:44:55.517 回答