溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mysql逗號拼接字符串的關(guān)聯(lián)查詢及統(tǒng)計問題怎么解決

發(fā)布時間:2023-03-07 16:01:30 來源:億速云 閱讀:172 作者:iii 欄目:MySQL數(shù)據(jù)庫

這篇“Mysql逗號拼接字符串的關(guān)聯(lián)查詢及統(tǒng)計問題怎么解決”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Mysql逗號拼接字符串的關(guān)聯(lián)查詢及統(tǒng)計問題怎么解決”文章吧。

背景:

數(shù)據(jù)庫中逗號拼接的字符串,想展示其完整拼接名稱或者按其值統(tǒng)計處理,怎么做?

FIND_IN_SET函數(shù)和GROUP_CONCAT函數(shù)你會用嗎?

一、查詢問題

eg兩張表 t_conclusion_detail(拜訪信息表) 和 t_conclusion_info(拜訪結(jié)論表)

t_conclusion_detail:

iduserNameconclusionIds
781918060586991616夢琪1,3
781986564770103296西施3
781989822074978304火舞2,3,4

t_conclusion_info:

conclusionIdconclusionName
1已成交
2暫無興趣
3需要跟進(jìn)
4溝通順利

想要的效果:

iduserNameconclusionIdsconclusionNameStr
781918060586991616夢琪1,3已成交,需要跟進(jìn)
781986564770103296西施3需要跟進(jìn)
781989822074978304火舞2,3,4暫無興趣,需要跟進(jìn),溝通順利

思考:

一般這種情況兩種方案:要么代碼層面處理,要么數(shù)據(jù)庫層面處理

1、方案一( 代碼層面):先查拜訪信息表,將數(shù)據(jù)返回到服務(wù)器,在代碼里進(jìn)行切割,然后再去拜訪結(jié)論表里面去查詢對應(yīng)的名稱,返回到程序進(jìn)行處理拼接。造成頻繁訪問數(shù)據(jù)庫,或需要批量查回再匹配處理,這樣做雖然很簡單也很好理解但是效率太低。

2、方案二(數(shù)據(jù)庫):以mysql為例,使用FIND_IN_SET函數(shù)和GROUP_CONCAT函數(shù)進(jìn)行查詢,但是數(shù)據(jù)量特別大時可能不友好,利用不上索引等

SELECT 
s.id,s.user_name userName,s.conclusion_ids conclusionIds,
(SELECT GROUP_CONCAT(user_name) 
FROM t_conclusion_info tr 
WHERE FIND_IN_SET(tr.conclusion_id,(SELECT conclusion_ids FROM t_conclusion_detail WHERE id=s.id))) AS conclusionNameStr
FROM t_conclusion_detail s

tip:如果數(shù)據(jù)量特別大建議還是設(shè)計時不要逗號拼接設(shè)計,改成多表聯(lián)查,或者使用代碼層面處理

二、統(tǒng)計問題

還是上述兩張表,想要的效果是每個結(jié)論出現(xiàn)頻次的統(tǒng)計,即統(tǒng)計逗號拼接的字符串中內(nèi)容

偽代碼,具體根據(jù)情況拼接業(yè)務(wù)sql:

SELECT
sum(case when find_in_set('1',conclusion_ids)>0  then 1 else 0 end) one,
sum(case when find_in_set('2',conclusion_ids) >0 then 1 else 0 end) two,
sum(case when find_in_set('3',conclusion_ids) >0 then 1 else 0 end) three,
sum(case when find_in_set('4',conclusion_ids) >0 then 1 else 0 end) four
from t_conclusion_detail

結(jié)果:

onetwothreefour
1131

三、效率問題

思考????: 模擬插入20萬數(shù)據(jù),查看find_in_set效率問題:

CREATE TABLE `t_conclusion_detail` (
   `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
   `user_name` varchar(32) COMMENT '姓名',
   `conclusion_ids` varchar(32) COMMENT '拜訪結(jié)論(多個結(jié)論逗號分隔)'
  PRIMARY KEY (`id`)    
) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='拜訪記錄表';
DROP PROCEDURE IF EXISTS `t_conclusion_detail_memory`

DELIMITER //
CREATE PROCEDURE `t_conclusion_detail_memory`(IN n INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE id INT DEFAULT 1;
    DECLARE num1 INT DEFAULT 1;
    DECLARE num2 INT DEFAULT 1;
    DECLARE num3 INT DEFAULT 1;
    WHILE i < n DO
        SET id = i;
        SET num1 = FLOOR(0 + RAND()*6);
        SET num2 = FLOOR(0 + RAND()*6);
        SET num3 = FLOOR(0 + RAND()*6);
        INSERT INTO `t_conclusion_detail` VALUES (id, 'test', concat(num1,',',num2,',',num3), );
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;  -- 改回默認(rèn)的 MySQL delimiter:';'

CALL t_conclusion_detail_memory(200000);

經(jīng)實驗,20w數(shù)據(jù)時相關(guān)查詢最慢2s左右,可接受范圍。

以上就是關(guān)于“Mysql逗號拼接字符串的關(guān)聯(lián)查詢及統(tǒng)計問題怎么解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI