久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

165次閱讀
沒有評論

共計 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è)資訊頻道。

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-07-13發(fā)表,共計2517字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網(wǎng)絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 华蓥市| 南雄市| 景德镇市| 阳东县| 法库县| 海盐县| 翁牛特旗| 沙田区| 鄂尔多斯市| 木兰县| 西青区| 社旗县| 泉州市| 涞源县| 宜宾县| 大庆市| 呈贡县| 科技| 济南市| 南溪县| 河西区| 南充市| 雷波县| 盖州市| 淮南市| 株洲县| 平乐县| 酒泉市| 通道| 彭水| 基隆市| 西城区| 灵丘县| 磐石市| 米易县| 利川市| 蒙城县| 黄石市| 四平市| 天等县| 濉溪县|