首页 > 解决方案 > 关于连接多个表的 SQL 语法

问题描述

我有 3 个这样的表:

表名:学生

id * | name
-----+------
 1   | Alice

表名:教师

id * | name
-----+------
 2   | Bob

表名:消息

msg_id * | from | message
---------+------+----------------------------
   100   |    1 | Hi, my name is Alice. I'm student.
   101   |    2 | Hi, my name is Bob. I'm teacher.
   102   }    1 | Another message from Alice.

你能帮我做一个 SQL 查询,结果如下:

msg_id | name  | message
-------+-------+-----------------------------------
   100 | Alice | Hi, my name is Alice. I'm student.
   101 | Bob   | Hi, my name is Bob. I'm teacher.
   102 | Alice | Another message from Alice.

标签: mysqlsql

解决方案


在不更改表结构的情况下,还有许多替代方法,例如使用带有标识个人类型的标志的人员表。但是回到你原来的和未修改的结构。“来自”显示您分别控制学生或教师表中的下一个“ID”。因为学生是 1,所以老师是 2(因此您正在控制 ID 的 IMPRESSION)。是否会有学生 ID = 1 和教师 ID = 1 的情况?

如果不是,那么您可以对每个表使用双左连接并拉取不为空的那个

select
      m.id,
      coalesce( s.name, t.name ) as Person,
      case when s.id is null then 'teacher' else 'student' end WhoAmI,
      m.message
   from
      Messages m
         left join Students s
            on m.from = s.id
         left join Teachers t
            on m.from = t.id

您显然可以获取任何订单/字段,但您可以看到我如何区分上面的部分。


推荐阅读