共計 2517 個字符,預計需要花費 7 分鐘才能閱讀完成。
這篇“Mysql 逗號拼接字符串的關聯(lián)查詢及統(tǒng)計問題怎么解決”文章的知識點大部分人都不太理解,所以丸趣 TV 小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Mysql 逗號拼接字符串的關聯(lián)查詢及統(tǒng)計問題怎么解決”文章吧。
背景:
數(shù)據(jù)庫中逗號拼接的字符串,想展示其完整拼接名稱或者按其值統(tǒng)計處理,怎么做?
FIND_IN_SET 函數(shù)和 GROUP_CONCAT 函數(shù)你會用嗎?
一、查詢問題
eg 兩張表 t_conclusion_detail(拜訪信息表 ) 和 t_conclusion_info(拜訪結論表)
t_conclusion_detail:
iduserNameconclusionIds781918060586991616 夢琪 1,3781986564770103296 西施 3781989822074978304 火舞 2,3,4
t_conclusion_info:
conclusionIdconclusionName1 已成交 2 暫無興趣 3 需要跟進 4 溝通順利
想要的效果:
iduserNameconclusionIdsconclusionNameStr781918060586991616 夢琪 1,3 已成交,需要跟進 781986564770103296 西施 3 需要跟進 781989822074978304 火舞 2,3,4 暫無興趣, 需要跟進, 溝通順利
思考:
一般這種情況兩種方案:要么代碼層面處理,要么數(shù)據(jù)庫層面處理
1、方案一(代碼層面):先查拜訪信息表,將數(shù)據(jù)返回到服務器,在代碼里進行切割,然后再去拜訪結論表里面去查詢對應的名稱,返回到程序進行處理拼接。造成頻繁訪問數(shù)據(jù)庫,或需要批量查回再匹配處理,這樣做雖然很簡單也很好理解但是效率太低。
2、方案二(數(shù)據(jù)庫):以 mysql 為例,使用 FIND_IN_SET 函數(shù)和 GROUP_CONCAT 函數(shù)進行查詢,但是數(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ù)量特別大建議還是設計時不要逗號拼接設計,改成多表聯(lián)查,或者使用代碼層面處理
二、統(tǒng)計問題
還是上述兩張表,想要的效果是每個結論出現(xiàn)頻次的統(tǒng)計,即統(tǒng)計逗號拼接的字符串中內容
偽代碼,具體根據(jù)情況拼接業(yè)務 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
結果:
onetwothreefour1131 三、效率問題
思考????:模擬插入 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 拜訪結論 (多個結論逗號分隔)
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 ; -- 改回默認的 MySQL delimiter:CALL t_conclusion_detail_memory(200000);
經(jīng)實驗,20w 數(shù)據(jù)時相關查詢最慢 2s 左右,可接受范圍。
以上就是關于“Mysql 逗號拼接字符串的關聯(lián)查詢及統(tǒng)計問題怎么解決”這篇文章的內容,相信大家都有了一定的了解,希望丸趣 TV 小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注丸趣 TV 行業(yè)資訊頻道。