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.
  • 相关阅读:
    Photoshop制作倒影的两种方法
    用CSS正确显示人民币符号的HTML转义字符
    CSS水平居中/垂直居中的N个方法
    有利于SEO的DIV+CSS的命名规则
    引用视频全屏播放代码
    分享:PHP获取MAC地址的实现代码
    设置nginx禁止通过IP访问服务器的方法
    php文件上传的例子
    apache开启gzip的方法
    perl命令批量替换文件内容
  • 原文地址:https://www.cnblogs.com/everda/p/9057585.html
Copyright © 2011-2022 走看看