将表行转换为mysql中的列

ejs*_*ncy 1 mysql syntax join pivot-table

假设我有一个类似于以下的数据库:

表student_info:

id    name
111   jon
112   dan
113   david
...
Run Code Online (Sandbox Code Playgroud)

和表分数:

item_id    student_id    score
01         111           37
02         111           45
01         112           55
02         112           44
01         113           66
02         113           45
...
Run Code Online (Sandbox Code Playgroud)

是否可以执行mysql查询来生成下表?:

Student_Name  ITEM_1_SCORE  ITEM_2_SCORE
jon           37            45
dan           55            44
david         66            45
...
Run Code Online (Sandbox Code Playgroud)

如果是这样,语法是什么?我不知道这是一个连接操作还是其他什么?

谢谢.

Joh*_*Woo 7

如果您只有两个值item_id,那么硬编码值就可以了.例

SELECT  a.Name AS Student_Name,
        MAX(CASE WHEN item_id = '01' THEN b.score END) Item_1_Score,
        MAX(CASE WHEN item_id = '02' THEN b.score END) Item_2_Score
FROM    student_info a
        LEFT JOIN scores b
            ON a.id = b.student_ID
GROUP   BY a.Name
Run Code Online (Sandbox Code Playgroud)

否则,当你有不知道的分数时,a Dynamic SQL是首选.

SELECT  GROUP_CONCAT(DISTINCT
        CONCAT('MAX(CASE WHEN item_id = ''',
               item_id,
               ''' THEN Score END) AS ',
               CONCAT('`Item_', item_id, '_Score`')
               )) INTO @sql
FROM scores;

SET @sql = CONCAT('SELECT   a.Name AS Student_Name, ', @sql, ' 
                    FROM    student_info a
                            LEFT JOIN scores b
                                ON a.id = b.student_ID
                    GROUP   BY a.Name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)

两个查询都将输出相同的内容

??????????????????????????????????????????????
? STUDENT_NAME ? ITEM_1_SCORE ? ITEM_2_SCORE ?
??????????????????????????????????????????????
? dan          ?           55 ?           44 ?
? david        ?           66 ?           45 ?
? jon          ?           37 ?           45 ?
??????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)