SQL 将表与其自身连接起来

标签 sql right-join

我有一个如下所示的表格:

+-----------+--------+------------+
| member_id |  name  | partner_id |
+-----------+--------+------------+
|         1 | John   | 2          |
|         2 | Eva    | 1          |
|         3 | Peter  | 4          |
|         4 | Mia    | 3          |
|         5 | Rachel | null       |
+-----------+--------+------------+

I want to display member name and name of its partner. I also need to display members without one. However, this is what I get when I use RIGTH JOIN:

SELECT m1.name, m2.name
FROM members m1
RIGHT JOIN members m2 ON m1.member_id=m2.partner_id
+--------+--------------+
|  name  | partner_name |
+--------+--------------+
| John   | Eva          |
| Eva    | John         |
| Peter  | Mia          |
| Mia    | Peter        |
| Rachel | null         |
+--------+--------------+

我希望他们作为情侣只显示一次。因此,当我得到 John - Eva 时,我不希望显示 Eva - John。这可以吗?

最佳答案

使用左连接:

select m.*, mp.name as partner_name
from members m left join
     members mp
     on m.partner_id = mp.member_id;

您的数据中有重复项,但它们似乎是对称的。一个简单的解决方法是:

select m.*, mp.name as partner_name
from (select m.*
      from members m
      where m.member_id < m.partner_id or
            m.partner_id is null
     ) m left join
     members mp
     on m.partner_id = mp.member_id;

Here是一个数据库<> fiddle 。

关于SQL 将表与其自身连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63981904/

相关文章:

mysql - INNER, OUTER OR RIGHT JOIN with 3 tables where one has same PK as the joining one 但 1st doesn't

mysql - 与供应商表和供应商评级表进行左连接时,仅显示一条记录

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql - "BEGIN"关键字使用不当

mysql - 覆盖sql表结构

MySQL 3个链接表的查询优化

php - 连接两个表并得到结果

mysql - 如何在 SQL 中(递归地)确定等效组?

sql - PL/SQL 写一个更新列的程序?

mysql左连接/右连接3张表