[英]Convert query to a Left-Join (?) to include userid's without a match
我正在尝试使用MySQL查询在Bowl Bowl Mania游戏中建立用户排行榜(每个用户都试图预测每场大学橄榄球比赛的获胜者,并为每个选择分配权重)。
我有3张桌子:
--games
id team1 team2 year
--picks
userid gameid points
--actResults
gameid winner
我想构建一个SELECT查询,根据每个用户对每个成功预测的游戏的“积分”下注顺序进行排序(即,对gameid = 1的成功下注5可获得5分,而失败的预测则可获得0)。
下面的查询几乎完成了我想要的,但是唯一的问题是它不包括零分的用户(即picks.winners和actResults.winners之间没有任何匹配的用户)。
SELECT DISTINCT picks.userid AS Player, SUM( picks.points ) AS Points
FROM picks, games, actResults
WHERE picks.gameid = games.id
AND picks.winner = actResults.winner
AND games.year = '2014'
AND picks.userid = picks.userid
GROUP BY picks.userid
ORDER BY Points DESC
期望的结果看起来像这样
Player Points
User1 10
User4 9
User3 4
User2 0
User5 0
困难的部分不是转换为LEFT JOIN
(基本上只涉及将逗号LEFT JOIN
更改为常规ANSI JOIN
,然后插入关键字LEFT
),而是修复SUM
表达式以仅将行添加到actResults.winner = picks.winner
。 这是一种实现方法:
SELECT picks.userid AS Player,
SUM(CASE WHEN actResults.winner IS NULL
THEN 0
ELSE picks.points
END) AS Points
FROM picks
JOIN games
ON games.id = picks.gameid
LEFT
JOIN actResults
ON actResults.winner = picks.winner
WHERE games.year = '2014'
GROUP BY picks.userid
ORDER BY Points DESC
;
(另一种方法是完全跳过LEFT JOIN
,并在子查询中使用EXISTS
表达式。)
编辑添加:要添加“ Available Points”字段,如评论中所要求,您可以编写:
SELECT picks.userid AS Player,
SUM(CASE WHEN actResults.winner = picks.winner
THEN picks.points
ELSE 0
END) AS Points,
SUM(CASE WHEN actResults.gameid IS NULL
THEN picks.points
ELSE 0
END) AS AvailablePoints
FROM picks
JOIN games
ON games.id = picks.gameid
LEFT
JOIN actResults
ON actResults.gameid = games.id
WHERE games.year = '2014'
GROUP BY picks.userid
ORDER BY Points DESC
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.