首页 > 解决方案 > 拉表行并将属性表行添加为附加列

问题描述

老实说,我不确定如何问这个问题,所以我将举例说明。

假设我有一张桌子company,它被设置为:

ID 姓名
1 导航公司
2 横幅有限责任公司

然后,有一个属性表,我们将其称为property设置:

ID company_id 标签 价值
1 2 电话 555-123-4567
2 2 城市 无处维尔
3 1 电话 555-987-6543
4 1 城市 别的地方

我希望能够提取结果:

ID 姓名 电话 城市
1 导航公司 555-987-6543 别的地方
2 横幅有限责任公司 555-123-4567 无处维尔

tag表格中的成为property字段标签,而value只是值。

现在,我知道我可以通过编写查询并property为每个不同的标签加入表来做到这一点,例如:

Select `company`.*, `phone`.`value`, `city`.`value`
From `company`
Left Join `property` As `phone` On (`company`.`id` = `phone`.`company_id` And `phone`.`tag` = 'Phone')
Left Join `property` As `city` On (`company`.`id` = `city`.`company_id` And `city`.`tag` = 'city')
Group By `company`.`id`;

但是,我希望能够从本质上为公司提取每个不同的标签,而不必像这样全部写出来。如果我添加一个新标签,我不想通过查询返回来添加它。

话虽如此,我知道我“应该”将拉列表时要提取的所有数据放入实际的公司表中,而属性表应该仅用于仅拉取一家公司的数据以显示信息时,但我仍然想知道这是否可以在更简单的查询中实现。

标签: mysql

解决方案


您可以通过条件聚合以某种方式简化查询:

select c.*, 
    max(case when p.tag = 'phone' then value end) as phone,
    max(case when p.tag = 'city'  then value end) as city
from company c
left join property p on p.company_id = p.id
group by c.id

但是,当新标签添加到属性表时,这不会自动创建新列(它只是使扩展查询更容易,因为您只需要修改select子句)。如果这是您想要的,那么您需要动态 SQL,这要复杂得多。


推荐阅读