sql - 多对多自引用选择sql查询

标签 sql mysql select

我为两个用户之间的关系设置了一个简单的表 (MySQL)。

 [User1Id] [User2Id]
  10        15
  14        10
  10        13

但是,我不知道如何执行 SELECT,以便我可以获取被请求用户的相反 UserId。因此,如果我想获取 ID 为 10 的用户的所有关系,它将获取用户 ID 15、14 和 13,并且理想情况下将这些 ID 加入用户表以获取这些用户的用户名。我目前的尝试不太理想:

 SELECT u1.username AS U1Username, 
        u2.username AS U2Username, 
        u1.userId AS U1UserId, 
        u2.userId AS U2UserId 
 FROM buddies b 
 LEFT JOIN users u1 on u1.userId=b.user2Id 
 LEFT JOIN users u2 on u2.userId=b.user1Id 
 WHERE b.user1Id=:1 OR b.user2Id=:1

然后在代码中进行过滤和重新排列。有没有一种方法可以让我执行一个 SQL 查询来获取我需要的一切?

最佳答案

使用:

SELECT u.userid,
       u.username
  FROM USERS u
 WHERE EXISTS(SELECT NULL
                FROM BUDDIES b
               WHERE u.userid = b.user1id
                 AND b.user2id = 10)
    OR EXISTS(SELECT NULL
                FROM BUDDIES b
               WHERE u.userid = b.user2id
                 AND b.user1id = 10)

...或者:

SELECT a.user1id,
       u.username
  FROM BUDDIES a
  JOIN USERS u ON u.userid = a.user1id
 WHERE a.user2id = 10
UNION 
SELECT b.user2id,
       u.username
  FROM BUDDIES b
  JOIN USERS u ON u.userid = b.user2id
 WHERE b.user1id = 10

UNION 将删除重复项; UNION ALL删除重复项并且速度更快。

关于sql - 多对多自引用选择sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037772/

相关文章:

sql - 归一化硬件

Mysql ON DUPLICATE KEY UPDATE inside Triger 语法错误

c# - 必须使用 Select 语句声明标量变量错误 C# ASP.NET Sql 命令

php - mySQL 查询在 WordPress 网站上执行两次

MySQL 使用 Disitinct 进行选择,以及使用 is_null 在哪里进行选择?

php - 通过php中的单选按钮onclick处理程序更新mysql中的标志

javascript - jQuery:如果选择了特定的 <select> 选项,则显示一个 div?

c# - 从 DataTable 中选择第二组 20 行

java - JSoup 从 unix 中的 HTML 选择

mysql - 简单的 SQL 内连接查询 - 无法工作