美文网首页
mysql json 分组排序

mysql json 分组排序

作者: 风轻云淡lq | 来源:发表于2019-08-20 18:04 被阅读0次

    需求: 统计用户各个维度信息,放入json串中

    参考mysql json文档(注意: json 类型时mysql5.7以上才出来,以前可以用text类型代替):

    里面包含各种json 函数的实例和用户,非常详细: https://www.cnblogs.com/ooo0/p/9309277.html
    常用的几个json 函数:

    # 查询json长度
    select JSON_LENGTH('[{"uid":108,"type":2,"aa":1},{"uid":1008,"type":2,"aa":1}]')
    #获取json中key的值
    select JSON_EXTRACT('[{"uid":108,"type":2},{"uid":1008,"type":2}]',"$[*].uid")
    

    使用mysql中聚合函数GROUP_CONCAT时,需要注意:

    #默认 GROUP_CONCAT 大小是1024,如果超出范围,会造成数据丢失,代码中加上如下,可以解决问题
    SET SESSION  group_concat_max_len=1024000;
    

    下面直接上生产代码

    # CONCAT用于拼接json, GROUP_CONCAT 用于分组排序
    SELECT p.device_id
        , CONCAT("[", GROUP_CONCAT(h.accunt_info ORDER BY JSON_EXTRACT(h.accunt_info, "$.dateline") SEPARATOR ','), "]") AS account_array
    FROM (
        SELECT device_id
        FROM db_channel.xxxx
        WHERE device_id IS NOT NULL
            AND device_id != ""
        GROUP BY device_id
    ) p
        JOIN (
            SELECT reg.deviceid
                , CONCAT('{"uid":', reg.uid, ',"dateline":"', ac.dateline, '","type":', reg.type, '}') AS accunt_info
            FROM db_log.xxxx
                JOIN (
                    SELECT uid, dateline
                    FROM db_user.xxx
                    WHERE account_type = 1
                        AND status != 2
                ) ac
                ON reg.uid = ac.uid
            WHERE deviceid IS NOT NULL
        ) h
        ON p.device_id = h.deviceid
    GROUP BY p.device_id
    

    相关文章

      网友评论

          本文标题:mysql json 分组排序

          本文链接:https://www.haomeiwen.com/subject/droxsctx.html