【问题标题】:mysql - join two tables to get data from same tables other rowmysql - 连接两个表以从同一表的另一行获取数据
【发布时间】:2020-06-20 15:48:23
【问题描述】:

我有两个名为 usersrequests 的表,其结构如下:

用户:

+----+----------+------------------------+
| id | name     | email                  |
+----+----------+------------------------+
| 1  | super    | super@test.com         |
+----+----------+------------------------+
| 2  | david    | david@test.com         |
+----+----------+------------------------+
| 3  | smith    | smith@test.com         |
+----+----------+------------------------+
| 4  | philip   | philip@test.com        |
+----+----------+------------------------+

请求:

+----+---------+----------------------+
| id | inviter | email                |
+----+---------+----------------------+
| 1  | 1       | david@test.com       |
+----+---------+----------------------+
| 2  | 2       | smith@test.com       |
+----+---------+----------------------+
| 3  | 2       | philip@test.com      |
+----+---------+----------------------+

现在我想加入这两个表来获取如下数据:

+----+----------+------------------------+-----------+
| id | name     | email                  | inviter   |
+----+----------+------------------------+-----------+
| 1  | super    | super@test.com         | null      |
+----+----------+------------------------+-----------+
| 2  | david    | david@test.com         | super     |
+----+----------+------------------------+-----------+
| 3  | smith    | smith@test.com         | david     |
+----+----------+------------------------+-----------+
| 4  | philip   | philip@test.com        | david     |
+----+----------+------------------------+-----------+

两个表将在email 属性上连接。并且结果表中的inviter 字段是存储在requests 表中inviter 属性下的对应id 的用户名。

我已经写了这个查询

select users.id as id, name, users.email as email, name, inviter
from users
left join requests on users.email = requests.email

产生以下结果

+----+--------+-----------------+--------+---------+
| id | name   | email           | name   | inviter |
+----+--------+-----------------+--------+---------+
|  2 | david  | david@test.com  | david  |       1 |
|  3 | smith  | smith@test.com  | smith  |       2 |
|  4 | philip | philip@test.com | philip |       2 |
|  1 | super  | super@test.com  | super  |    NULL |
+----+--------+-----------------+--------+---------+

谁能帮我写一个查询来按预期获取数据?

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    您必须再次加入usersrequestsusers 才能获得inviter 的名称:

    select u.*, u2.name inviter
    from users u 
    left join requests r on r.email = u.email
    left join users u2 on u2.id = r.inviter
    order by u.id
    

    请参阅demo
    结果:

    | id  | name   | email           | inviter |
    | --- | ------ | --------------- | ------- |
    | 1   | super  | super@test.com  |         |
    | 2   | david  | david@test.com  | super   |
    | 3   | smith  | smith@test.com  | david   |
    | 4   | philip | philip@test.com | david   |
    

    【讨论】:

      【解决方案2】:

      您需要对用户表使用两次左连接才能获得此信息,请参阅下面的 db fiddle 和查询

      SELECT US.*, US1.name 
      FROM users AS US 
      LEFT JOIN requests AS RQ ON RQ.email = US.email
      LEFT JOIN users AS US1 ON US1.id = RQ.inviter
      

      DB FIDDLE 链接:HERE

      【讨论】:

        【解决方案3】:

        您需要再次加入表users 以获得邀请者的姓名。例如:

        select
          u.*,
          u2.name as inviter
        from users u
        left join requests r on r.email. = u.email
        left join users u2 on u2.id = r.inviter
        order by u.id
        

        【讨论】:

          猜你喜欢
          • 2021-11-05
          • 1970-01-01
          • 1970-01-01
          • 2014-10-20
          • 1970-01-01
          • 2012-01-12
          • 2016-09-28
          • 1970-01-01
          • 2010-10-24
          相关资源
          最近更新 更多