mySQL查询2个表左联接

时间:2019-03-30 01:44:05

标签: mysql sql left-join

我有2个表-用户和结果

ID | UserID | League
1  | 123    | Great
2  | 124    | Great  
3  | 125    | Great  
4  | 123    | Ultra  
5  | 124    | Ultra  
6  | 126    | Ultra  

ID | Winner | Loser | League
1  | 124    | 123   | Great
2  | 124    | 123   | Ultra
3  | 124    | 125   | Great

如果用户表中有该联赛,我想选择之前未与该用户进行过特定联赛的所有不同UserID。

因此,如果我要为126 Ultra做它,它应该返回-123,124 而对于123伟大-125

到目前为止我有

SELECT DISTINCT UserID FROM `User` t1 LEFT JOIN `Result` t2 ON (t1.UserID = t2.Winner OR t1.UserID = t2.Loser) WHERE UserID != 125 AND t1.League = 'Ultra' AND t2.id IS NULL

我不确定我缺少什么,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

要获得所需的结果,您需要获取感兴趣的联盟中所有用户的列表(不包括正在搜索的用户),然后将其LEFT JOIN移至Result表中,仅选择没有匹配结果的行。然后,将为您提供特定用户未曾在该联赛中踢过的用户列表。在MariaDB 10.3中,可以使用CTE完成此操作(此示例适用于用户123 Great):

WITH Users AS
  (SELECT DISTINCT UserID 
   FROM User
   WHERE League = 'Great' AND UserID != 123)
SELECT UserID
FROM Users u
LEFT JOIN Result r ON r.League = 'Great'
                  AND ((r.Winner = u.UserID AND r.Loser = 123)
                    OR (r.Winner = 123 AND r.Loser = u.UserID)
                      )
WHERE r.ID IS NULL

输出:

UserID
125

dbfiddle上的演示(包括126 Ultra的结果)