zoukankan      html  css  js  c++  java
  • 【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.
  • 相关阅读:
    路径问题
    移动端推荐使用
    js获取各种宽高方法
    html 符号大全
    bzoj4923 K小值查询
    bzoj3781 小B的询问
    bzoj1799 [Ahoi2009]self 同类分布
    bzoj2005 [Noi2010]能量采集
    bzoj4039 集会
    bzoj2516 电梯
  • 原文地址:https://www.cnblogs.com/everda/p/9057585.html
Copyright © 2011-2022 走看看