首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mySQL查询2个表的左联接

mySQL查询2个表的左联接
EN

Stack Overflow用户
提问于 2019-03-30 09:44:05
回答 1查看 33关注 0票数 0

我有两个表-用户和结果

代码语言:javascript
复制
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

我不确定我错过了什么,任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-30 10:05:02

要获得您想要的结果,您需要获取感兴趣的联盟中的所有用户(不包括您正在搜索的用户)的列表,然后将其LEFT JOINResult表,只选择没有匹配结果的行。这将为您提供特定用户在该联盟中未玩过的用户列表。在MariaDB 10.3中,这可以通过CTE来完成(本例针对用户123 Great):

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
UserID
125

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55427393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档