mysql - SQL - 将组元素转换为新列

标签 mysql sql group-by pivot

我手头得到以下查询结果:

SELECT DISTINCT director, name
FROM Movie m
JOIN Rating ra ON m.mid = ra.mid
JOIN Reviewer re ON ra.rid = re.rid
WHERE director IS NOT NULL
ORDER BY director, name;
+------------------+------------------+
| director         | name             |
+------------------+------------------+
| James Cameron    | Elizabeth Thomas |
| James Cameron    | James Cameron    |
| Robert Wise      | Brittany Harris  |
| Robert Wise      | Chris Jackson    |
| Steven Spielberg | Ashley White     |
| Steven Spielberg | Brittany Harris  |
| Steven Spielberg | Chris Jackson    |
| Victor Fleming   | Mike Anderson    |
| Victor Fleming   | Sarah Martinez   |
+------------------+------------------+

最终我想获得一个数据透视表,其中所有董事都在一行,所有匹配的审稿人姓名都在自己的列中。就像这样:

director         | name1            | name2           | name3
-----------------+------------------+-----------------+---------------+
James Cameron    | Elizabeth Thomas |James Cameron    | <null>
Steven Spielberg | Ashley White     | Brittany Harris | Chris Jackson
.......

任何帮助将不胜感激!

最佳答案

MySQL 没有内置的数据透视功能。另外,你怎么知道正好有3个审稿人呢? SQL查询需要返回固定数量的列。

相反,您可以使用 group_concat() 将所有审阅者放在一个列表中:

SELECT m.director, GROUP_CONCAT(r.name SEPARATOR ', ') as reviewers
FROM Movie m JOIN
     Rating ra
     ON m.mid = ra.mid JOIN
     Reviewer re
     ON ra.rid = re.rid
WHERE director IS NOT NULL
GROUP BY m.director
ORDER BY director;

如果审阅者可以多次审阅一位导演,那么您需要DISTINCT:

SELECT m.director, GROUP_CONCAT(DISTINCT r.name SEPARATOR ', ') as reviewers

关于mysql - SQL - 将组元素转换为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49924089/

相关文章:

javascript - 无法从注册表中将数据从 PHP 插入到 MYSQL 服务器

mysql - 如何在mysql中检查用户的任务分配时间?

mysql - 错误 1064,mysql 命令

sql - CakePHP和SQL Server 2008,分组依据不起作用

postgresql - 需要明智地选择员工部门的平均年龄

php - 代码点火器 : How to make the nested selection for related tables

mysql - 如何将XML数据导入mysql表

mysql - 从 MySQL 子集中选择多个条件的有效方法

php - 如何按名称列出两个连接表信息(一些有名称,一些可能为空)

SQL 分组限制