MySQL:对列上的元素进行分组和展平

Posted

技术标签:

【中文标题】MySQL:对列上的元素进行分组和展平【英文标题】:MySQL: Group and flatten elements on a column 【发布时间】:2014-02-19 14:05:18 【问题描述】:

如果我有意见:

Movie             Genre    Actor
-------------------------------------------
Ocean's Twelve    Crime    George Clooney
Ocean's Twelve    Crime    Julia Roberts
Ocean's Twelve    Crime    Brad Pitt
Forrest Gump      Drama    Tom Hanks

我如何按电影标题分组,但像这样展平其他列:

Movie             Genre    Actor
-------------------------------------------
Ocean's Twelve    Crime    George Clooney, Julia Roberts, Brad Pitt
Forrest Gump      Drama    Tom Hanks

注意,如果一个元素是等价的,它就不会重复(例如Crime

【问题讨论】:

【参考方案1】:

MySQL

使用GROUP_CONCAT()函数:

SELECT movie, Genre, GROUP_CONCAT(Actor) AS Actor
FROM tableA
GROUP BY movie, Genre

SQL 服务器

SELECT A.movie, A.Genre, MAX(STUFF(B.ActorNames, 1, 1, '')) AS Actor
FROM tableA A 
CROSS APPLY(SELECT ' ' + Actor + ',' FROM tableA B 
            WHERE A.movie = B.movie AND A.Genre = B.Genre 
            FOR XML PATH('')
          ) AS B (ActorNames)
GROUP BY A.movie, A.Genre

【讨论】:

【参考方案2】:

您正在寻找GROUP_CONCAT

select Movie, Genre, group_concat(Actor separator ', ') as `Actors`
from
movies
group by Movie, Genre;

【讨论】:

如何在 sql server 中做到这一点? @mhasan 使用其中一种解决方法here 和here。我通常使用XML PATH hack。【参考方案3】:

你需要 group_concat 和 group by http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat 试试这个

select Movie, Genre, group_concat(Actor) from view_name group by Movie

【讨论】:

以上是关于MySQL:对列上的元素进行分组和展平的主要内容,如果未能解决你的问题,请参考以下文章

如何对多个列上的数据集进行分组并同时进行不同的聚合? Python

mysql 行转列,对列的分组求和,对行求和

Laravel 选择列,然后按日期对列值进行分组

pandas-对列中具有相同值的连续行进行分组和聚合

熊猫在一列上分组,另一列上的最大日期python

是否有代码对列中包含的相似单词进行分组