mysql 如何根据特定列连接多个数据库输出的输出?

dz6r00yl  于 5个月前  发布在  Mysql
关注(0)|答案(2)|浏览(60)

我有以下格式的多个查询:
查询1:

Select id,first_name,middle_name
from table1
where id < 4

字符串
输出1:
| ID|名字|中间名|
| --|--|--|
| 1 |琳达|玛丽|
| 2 |玛丽|爱丽丝|
| 3 |约翰|史蒂文|
疑问二:

Select id,last_name
from table2
where id < 4


输出2:包含可选列(姓氏),这意味着它不显示所有条目,只有当它有一个值。
| ID|姓氏(_N)|
| --|--|
| 1 |Jackson|
| 3 |汤姆森|
我如何得到以下内容?ID列是公共的,并正确地关联不同的输出.
| ID|名字|中间名|姓氏(_N)|
| --|--|--|--|
| 1 |琳达|玛丽|Jackson|
| 2 |玛丽|爱丽丝|NULL|
| 3 |约翰|史蒂文|汤姆森|
更复杂的情况
表1
| ID|条目|结果|
| --|--|--|
| 1 |名字|琳达|
| 2 |名字|玛丽|
| 3 |名字|约翰|
| 1 |第二名|利亚姆|
| 2 |第二名|紫|
| 3 |第二名|夏洛特|
表2
| ID|条目|结果|
| --|--|--|
| 1 |中间名|玛丽|
| 2 |中间名|爱丽丝|
| 3 |中间名|史蒂文|
| 1 |姓氏(_N)|Jackson|
| 3 |姓氏(_N)|汤姆森|
期望输出仍然是
| ID|名字|中间名|姓氏(_N)|
| --|--|--|--|
| 1 |琳达|玛丽|Jackson|
| 2 |玛丽|爱丽丝|NULL|
| 3 |约翰|史蒂文|汤姆森|

yrdbyhpb

yrdbyhpb1#

将JOIN添加到table 2。

select a.id, a.first_name, a.middle_name, b.last_name
from table1 a
left join table2 b
  on a.id = b.id
where a.id < 4

字符串

更新

根据您最近对问题的编辑,您可以使用conditional aggregation来实现这些更新的结果。

select 
 a.id, 
 max(case when a.entry = 'first_name' then a.result end) as first_name,
 max(case when b.entry = 'middle_name' then b.result end) as middle_name, 
 max(case when b.entry = 'last_name' then b.result end) as last_name
from table1 a
left join table2 b
  on a.id = b.id
group by a.id;


| ID|名字|中间名|姓氏(_N)|
| --|--|--|--|
| 1 |琳达|玛丽|Jackson|
| 2 |玛丽|爱丽丝||
| 3 |约翰|史蒂文|汤姆森|
View on DB Fiddle

11dmarpk

11dmarpk2#

这可以通过LEFT JOIN来实现:

Select t1.id, t1.first_name, t1.middle_name, t2.last_name
from table1 t1
left join table2 t2 on t1.id = t2.id
where t1.id < 4

字符串
根据您最近的编辑,数据结构已更改为实体-属性-值模型(EAV)。
我也使用了条件聚合,但只应用于table 2以获取中间名和姓氏:

select t1.*, t2.middle_name, t2.last_name
from (
  select id, result as first_name
  from table1
  where entry = 'first_name'
) as t1
left join (
  select id, max(case when entry = 'middle_name' then result end) as middle_name,
             max(case when entry = 'last_name' then result end) as last_name
  from table2
  group by id
) as t2 on t1.id = t2.id;


Demo here

相关问题