MySQL-使用列值连接同一查询

MySQL-使用列值连接同一查询,mysql,sql,join,Mysql,Sql,Join,我有三张类似这样的桌子: 表联接 |ID|JOIN_NAME| 1 persons 2 companies 表信息 |ID|JOIN_ID| 1 1 2 2 表信息\u额外人员 |ID|INFORMATION_ID|NAME| 1 1 John 表额外公司信息 |ID|INFORMATION_ID|NAME| 1 2 IBM 如何在一个SQL中连接这些表?我试过这样的方法: SELECT * FROM `info

我有三张类似这样的桌子:

联接

|ID|JOIN_NAME|
 1  persons
 2  companies
信息

|ID|JOIN_ID|
 1  1
 2  2
信息\u额外人员

|ID|INFORMATION_ID|NAME|
 1  1              John
额外公司信息

|ID|INFORMATION_ID|NAME|
 1  2              IBM
如何在一个SQL中连接这些表?我试过这样的方法:

SELECT * FROM `information`
INNER JOIN `information_extra_(SELECT `name` FROM `joins` WHERE `id` = `join_id`)`
ON `information_extra_(SELECT `name` FROM `joins` WHERE `id` = `join_id`)`.`information_id` = `information`.`id`

但我不能让它工作。当然这不是我实际的桌子设置,但原理是一样的。有人知道如何在一个SQL中获取所有信息吗?

实际上是四个表,而不是三个表。这不仅仅是一个吹毛求疵的问题——看起来您问题的实质是“如何将表名用作联接条件的一部分?”(即,如何将信息表作为单个表处理?)

答案是:你不能。(在动态SQL之外。)

在这种特定情况下,以下内容应返回我认为您正在寻找的内容:

select j.join_name joined_entity,
       case when j.join_name = 'persons' then p.name
            else c.name
       end joined_entity_name
from information i
inner join joins j on i.join_id = j.id
left join information_extra_persons p on i.id = p.information_id
left join information_extra_companies c on i.id = c.information_id
或者,效率较低(但更一般)的方法可能是:

select j.join_name joined_entity,
       v.name joined_entity_name
from information i
inner join joins j on i.join_id = j.id
inner join (select 'persons' entity, information_id, name from information_extra_persons
            union all
            select 'companies' entity, information_id, name from information_extra_companies) v
           on i.id = v.information_id and j.join_name = v.entity

实际上是四张桌子,不是三张。这不仅仅是一个吹毛求疵的问题——看起来您问题的实质是“如何将表名用作联接条件的一部分?”(即,如何将信息表作为单个表处理?)

答案是:你不能。(在动态SQL之外。)

在这种特定情况下,以下内容应返回我认为您正在寻找的内容:

select j.join_name joined_entity,
       case when j.join_name = 'persons' then p.name
            else c.name
       end joined_entity_name
from information i
inner join joins j on i.join_id = j.id
left join information_extra_persons p on i.id = p.information_id
left join information_extra_companies c on i.id = c.information_id
或者,效率较低(但更一般)的方法可能是:

select j.join_name joined_entity,
       v.name joined_entity_name
from information i
inner join joins j on i.join_id = j.id
inner join (select 'persons' entity, information_id, name from information_extra_persons
            union all
            select 'companies' entity, information_id, name from information_extra_companies) v
           on i.id = v.information_id and j.join_name = v.entity

如果您需要动态连接,这是不可能的,因为SQL没有提供任何功能!如果您需要动态连接,这是不可能的,因为SQL没有提供任何功能!