我有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
我不确定我缺少什么,任何帮助将不胜感激。
答案 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
的结果)