繁体   English   中英

将查询转换为左联接(?)以包括不匹配的用户ID

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM