mysql json 分組排序

需求: 統(tǒng)計(jì)用戶各個(gè)維度信息,放入json串中

參考mysql json文檔(注意: json 類型時(shí)mysql5.7以上才出來,以前可以用text類型代替):

里面包含各種json 函數(shù)的實(shí)例和用戶,非常詳細(xì): https://www.cnblogs.com/ooo0/p/9309277.html
常用的幾個(gè)json 函數(shù):

# 查詢json長(zhǎng)度
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中聚合函數(shù)GROUP_CONCAT時(shí),需要注意:

#默認(rèn) GROUP_CONCAT 大小是1024,如果超出范圍,會(huì)造成數(shù)據(jù)丟失,代碼中加上如下,可以解決問題
SET SESSION  group_concat_max_len=1024000;

下面直接上生產(chǎn)代碼

# 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容