MySQL将多行作为列连接

Mas*_*ers 19 php mysql sql join

假设我在MySQL数据库中有两个表.

表格1:

ID    Name
1     Jim
2     Bob
Run Code Online (Sandbox Code Playgroud)

表2:

ID    Place    Race_Number
1     2nd      1
1     3rd      2
1     4th      3
2     1st      1
2     2nd      2
2     2nd      3
Run Code Online (Sandbox Code Playgroud)

从数据库中选择行时,有没有办法将第二个表中的行作为列连接到第一个表?目前我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

MySQL查询中的所需结果是:

ID    Name    Race1    Race2    Race3
1     Jim     2nd      3rd      4th
2     Bob     1st      2nd      2nd
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!

Joh*_*Woo 41

一个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
Run Code Online (Sandbox Code Playgroud)

但是如果你的数量不详RACE,那么a 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;
Run Code Online (Sandbox Code Playgroud)