【问题标题】:MySQL Join Multiple Rows as ColumnsMySQL 将多行作为列连接
【发布时间】: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 可以有无限数量的比赛。

感谢您的帮助!

【问题讨论】:

    标签: php mysql sql join


    【解决方案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;
    

    【讨论】:

    • 在我类似的查询 (stackoverflow.com/q/24531320/1560056) 中,我遇到了列的顺序问题,这些列的顺序并不总是按升序排列。要解决此问题,请通过在 GROUP_CONCAT() 的末尾添加“ORDER BY Race_Number DESC”来指定顺序。为我工作。
    • 这是一个很好的答案,也可以将 MAX 用于 VARCHAR 列!
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 2012-08-15
    • 2011-06-24
    • 2019-04-15
    • 1970-01-01
    • 2012-12-10
    • 2021-09-16
    • 2012-03-21
    相关资源
    最近更新 更多