mysql - 拉表行并将属性表行添加为附加列
问题描述
老实说,我不确定如何问这个问题,所以我将举例说明。
假设我有一张桌子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`;
但是,我希望能够从本质上为公司提取每个不同的标签,而不必像这样全部写出来。如果我添加一个新标签,我不想通过查询返回来添加它。
话虽如此,我知道我“应该”将拉列表时要提取的所有数据放入实际的公司表中,而属性表应该仅用于仅拉取一家公司的数据以显示信息时,但我仍然想知道这是否可以在更简单的查询中实现。
解决方案
您可以通过条件聚合以某种方式简化查询:
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,这要复杂得多。
推荐阅读
- javascript - 创建 Web 组件时如何定义全局常量?
- javascript - 邮递员中的令牌无法获取值
- javascript - 对象可能为“空”:TypeScript、React useRef 和 Formik innerRef
- javascript - Vuetify Uncaught TypeError:无法读取未定义的属性“安装”
- javascript - 我今天遇到了 window.addEventListener 和 React Native 的问题
- android - 未解决的参考 layoutInflater Android 视图绑定
- javascript - 如何在jQuery / javascript中将多个对象合并为一个对象
- r - 有没有办法使用 R 在网站上查找重复的单词?例如一篇新闻文章
- python - python 2to3:如何选择性地启用修复程序并且只执行其中的一两个?
- http - ASP.NET Core Web 应用程序为每个请求返回不同的响应标头