MySQL:将单行结果放在单独的列中

马尔特

我使用的是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将正文放在一个列中,将图像放在单独的右列中

GROUP BY将每个组成员放在单独的列中

合并行并将其值放在mysql的单独列中

Postgres,使用列中的值将结果聚合到单行

MySQL将逗号分隔的结果转换为单独的列

将分组结果统计到熊猫的单独列中

将 IN 子查询的结果插入到单独的列中

将获取功能放在单独的组件中

将嵌套类放在单独的文件中

MySQL - 一对多查询,结果在单独的列中

单行mysql中的多列

在R中,如何将字符(等级)转换为数字并放在单独的列中

如何将单选按钮标签放在单行中

使用 itextsharp 将单独签名的散列放在 PDF 中的多个位置

如何使用Java将数据放在单独的新列csv中?

MySQL如何将相同的记录放在单独的列中?

加入同一个表时,如何将加入的数据放在单独的行而不是单独的列中?

格式R输出,以将每个结果放在单独的行中并以字母作为行标识符

将jquery结果放在输入字段中

将ajax请求的结果放在div中

将 JS 结果放在 php 变量中

如何将MySQL数据库的结果放在Node.js中的变量中?

mysql减去多个列的值并将结果放在一个空列中

将多行插入到单行mysql中

将多行中的列合并为单行

从同一列中提取不同的查询,结果将显示在单独的列中

如何将两个选择结果并排放在列中?

将代码放在单独的文件中 react native

如何将Ionic 2 Modal放在单独的文件中?