【SQL函数】我知道你想group_concat和count一起用,比如不同组合的人数?

0.背景

前几天复习了一下MySQL函数,知道一个group_concat函数很好用,但一直没实际用过。今天碰到一个问题,把我问懵逼了。

1.实例

假设有一张用户购买产品的增量表order_list,字段为id(主键自增不用管),product_id(产品ID,属性值为A、B、C、D),user_id(用户ID)。
如下图:

#附创建表和插入数据
CREATE TABLE `order_list` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `product_id` char(10) DEFAULT NULL,
  `user_id` int(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

INSERT INTO order_list(product_id,user_id) VALUES('A',1),('A',1),('B',1),('C',2),('A',2),('A',3),('B',2),('C',2),('D',1);

2.列出每个用户购买过的所有产品(去重)

#查询每个user_id购买过的所有产品(去重)
select o.`user_id`,group_concat(distinct o.`product_id` ORDER BY o.`product_id`  Asc SEPARATOR ' ') from order_list o
group by o.`user_id`
#说明:1.group_concat里的distinct不是必须的,没有只是不去重;
#2.ORDER BY o.`product_id`  ASC也不是必须的,默认是合并的部分就是按升序排列,想按降序可以用DESC;
#3.SEPARATOR ' '也不是必须的,默认是按逗号分隔。
#例如:
SELECT o.`user_id`,GROUP_CONCAT(o.`product_id`) FROM order_list o
GROUP BY o.`user_id`


2.各个产品组合分别有多少用户数

#查询同时拥有多个产品的各个产品组合分别有多少人
select t.product_group,count(t.user_id) from
(select o.`user_id`,group_concat(distinct o.`product_id` ORDER BY o.`product_id`  Asc SEPARATOR ' ') 'product_group' from order_list o
group by o.`user_id`
)t
group by t.product_group

3.全部可能产品组合分别有多少人

即查询有A/B/C/D/AB/AC/AD/BC/BD/CD/ABC... .../ABCD的一共4+6+4+1=15种组合的分别有多少个?
例如:user_id为1的A、B、D都买过,那么在A/B/D/AB/BD/ABD这几个组合里都+1。
——没想出来

Without summary,you can't master it.
原文地址:https://www.cnblogs.com/everda/p/9057585.html