Search code examples
mysqlgroup-concat

How to GROUP BY on a GROUP_CONCAT(DISTINCT xxx) as yyyy


I am trying to GROUP BY a MYSQL request on a GROUP_CONCAT. The trio of values that is generated by this GROUP_CONCAT is the only unique identifier that I have to describe the group I want to apply the GROUP BY.

When I do the following :

SELECT [...] GROUP_CONCAT(DISTINCT xxx) as supsku
[...]
GROUP BY supsku

it says :

Can't group on 'supsku'

Thanks a lot


Solution

  • You can't group by a column whose contents don't exist until after the groups are formed. That's a chicken-and-egg problem.

    By analogy, suppose I ask you to scratch off some lottery tickets, but scratch them only if the total value of the winning tickets is more than $100? Obviously, you can't know what the winning values are before you scratch the lottery tickets, so you can't know if you should scratch them or not.

    The answer from @MKhalidJunaid shows part of the solution -- using a subquery to produce a partial result with the strings formed into groups. Then embed that as a derived table subquery to be further processed by an outer query with a GROUP BY.

    But the problem with that solution is that we don't know how to group the strings in the inner subquery. Without a valid GROUP BY in the subquery, the default is to treat the whole table as one group, and therefore GROUP_CONCAT will return one row with one string.

    So you need to think about defining your problem better. There must be some other grouping criterion you have in mind.