我有两个表-用户和结果
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,如果他们在user表中有特定的联盟,那么他们之前没有与某个用户进行过特定的联盟。
因此,如果我对126 Ultra执行此操作,则应该返回- 123,124,而对于123 Great - 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
我不确定我错过了什么,任何帮助都将不胜感激。
发布于 2019-03-30 10:05:02
要获得您想要的结果,您需要获取感兴趣的联盟中的所有用户(不包括您正在搜索的用户)的列表,然后将其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
125dbfiddle上的演示(包括126 Ultra的结果)
https://stackoverflow.com/questions/55427393
复制相似问题