我使用的是MySQL 5.7.31版,但在需要时仅安装了MySQL服务器8版
我有一个表,其中包含有关实体的一系列信息,例如:
+------+-----+
| Name | Age |
+------+-----+
| Bob | 22 |
| Jack | 15 |
| Jane | 25 |
+------+-----+
在另一个表格中,我可以知道哪些技能属于姓名和年龄的组合,例如:
+-------------+------+-----+
| Skill | Name | Age |
+-------------+------+-----+
| programming | Bob | 22 |
| programming | Jane | 25 |
| marketing | Jane | 25 |
+-------------+------+-----+
这使我能够选择25岁的Jane的所有技能-返回2行。但是,我被要求在如下所示的最终视图中将它们分别放入每个实体的单独的列中,并且我正在努力寻找方法。当我获得上面显示的表格中提供的其他行时,该视图应继续工作
+------+-----+-------------+-----------+--------+
| Name | Age | skill1 | skill2 | skill3 |
+------+-----+-------------+-----------+--------+
| Bob | 22 | programming | Na | Na |
| Jack | 15 | Na | Na | Na |
| Jane | 25 | programming | marketing | Na |
+------+-----+-------------+-----------+--------+
如果要在MySQL 5.7的不同列中使用它们,则可能最简单的方法是关联子查询:
select p.*,
(select ps.skill
from person_skills ps
where ps.name = p.name and ps.age = p.age
order by ps.skill
limit 1 offset 0
) as skill_1,
(select ps.skill
from person_skills ps
where ps.name = p.name and ps.age = p.age
order by ps.skill
limit 1 offset 1
) as skill_2,
(select ps.skill
from person_skills ps
where ps.name = p.name and ps.age = p.age
order by ps.skill
limit 1 offset 2
) as skill_3
from persons p;
这看起来很复杂,但是除了之外,三个子查询都相同offset
。
注意:这将返回,NULL
而不是'NA'
在没有可用技能时返回。这是表示不可用值的典型方法。
如果确实需要'NA'
,可以使用COALESCE()
:
coalesce( (select ps.skill
from person_skills ps
where ps.name = p.name and ps.age = p.age
order by ps.skill
limit 1 offset 0
), 'NA') as skill_1,
较旧版本中的替代方法是使用group_concat()
:
select p.name, p.age,
substring_index(group_concat(ps.skill order by ps.skill), ',', 1) as skill_1,
substring_index(substring_index(group_concat(ps.skill order by ps.skill), ',', 2), ',', -1) as skill_2,
substring_index(substring_index(group_concat(ps.skill order by ps.skill), ',', 3), ',', -1) as skill_3
from persons p left join
person_skills ps
on ps.name = p.name and ps.age = p.age
group by p.name, p.age;
这会将所有技能聚合到一个字符串中,然后提取第n个元素。
对于'NA'
,您可以COALESCE()
像上面那样使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句