我正在使用PHP / MySQL建立一个Hockey Sports得分和预测系统。以下是系统设计。
我有一个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 :(得分: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(包含您的数据)
答案 1 :(得分: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