MySQL 将多行作为列连接

Posted

技术标签:

【中文标题】MySQL 将多行作为列连接【英文标题】:MySQL Join Multiple Rows as Columns 【发布时间】:2013-03-05 23:00:48 【问题描述】:

假设我在 mysql 数据库中有两个表。

表 1:

ID    Name
1     Jim
2     Bob

表 2:

ID    Place    Race_Number
1     2nd      1
1     3rd      2
1     4th      3
2     1st      1
2     2nd      2
2     2nd      3

从数据库中选择行时,有没有办法将第二个表中的行作为列连接到第一个表?目前我正在使用SELECT * FROM Table1 NATURAL JOIN Table2

这个输出:

ID   Name    Place    Race_Number
1    Jim     2nd      1
1    Jim     3rd      2
1    Jim     4th      3
2    Bob     1st      1
2    Bob     2nd      2
2    Bob     2nd      3

目前我正在我的 php 脚本中对其进行排序,以将其排序为一个数组。这很痛苦,因为我必须查看 ID 并查看它们是否相同,然后进行相应的排序。我觉得有一种方法可以在 MySQL 中正确执行此操作,而无需在 PHP 中将其排序到数组中。每个 ID 在第二个表中可以有无限数量的条目。

来自 MySQL 查询的期望结果是:

ID    Name    Race1    Race2    Race3
1     Jim     2nd      3rd      4th
2     Bob     1st      2nd      2nd

我不能自己在表中为 Race1、Race2 等创建列,因为每个 ID 可以有无限数量的比赛。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

INNER JOIN 将满足您的需求。 MySQL 没有PIVOT 函数,你仍然可以使用CASEMAX() 函数来模拟它。

SELECT  a.ID, a.NAME,
        MAX(CASE WHEN b.Race_Number = 1 THEN b.Place ELSE NULL END) Race1,
        MAX(CASE WHEN b.Race_Number = 2 THEN b.Place ELSE NULL END) Race2,
        MAX(CASE WHEN b.Race_Number = 3 THEN b.Place ELSE NULL END) Race3
FROM    Table1 a
        INNER JOIN Table2 b
            ON a.ID = b.ID
GROUP   BY a.ID, a.Name

但如果你有未知数量的RACE,那么DYNAMIC SQL 更可取。

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number,
      ' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`'))
    ) INTO @sql
FROM Table2;

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
                   FROM Table1 a
                   LEFT JOIN Table2 b 
                        ON ON a.ID = b.ID
                   GROUP   BY a.ID, a.Name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【讨论】:

在我类似的查询 (***.com/q/24531320/1560056) 中,我遇到了列的顺序问题,这些列的顺序并不总是按升序排列。要解决此问题,请通过在 GROUP_CONCAT() 的末尾添加“ORDER BY Race_Number DESC”来指定顺序。为我工作。 这是一个很好的答案,也可以将 MAX 用于 VARCHAR 列!

以上是关于MySQL 将多行作为列连接的主要内容,如果未能解决你的问题,请参考以下文章

将具有多行的一列旋转到一个连接的行

使用 case 语句将多行连接成一列

在 Hive 中使用分隔符连接多行

MySql - 使用连接子查询插入多行?

MySQL Join VIEW,将列连接成一个字符串

pandas中的SQL查询:根据其他列的组合在列中连接多行