您好,登錄后才能下訂單哦!
這篇“Mysql逗號拼接字符串的關聯查詢及統計問題怎么解決”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Mysql逗號拼接字符串的關聯查詢及統計問題怎么解決”文章吧。
數據庫中逗號拼接的字符串,想展示其完整拼接名稱或者按其值統計處理,怎么做?
FIND_IN_SET函數和GROUP_CONCAT函數你會用嗎?
eg兩張表 t_conclusion_detail(拜訪信息表) 和 t_conclusion_info(拜訪結論表)
t_conclusion_detail:
id | userName | conclusionIds |
---|---|---|
781918060586991616 | 夢琪 | 1,3 |
781986564770103296 | 西施 | 3 |
781989822074978304 | 火舞 | 2,3,4 |
t_conclusion_info:
conclusionId | conclusionName |
---|---|
1 | 已成交 |
2 | 暫無興趣 |
3 | 需要跟進 |
4 | 溝通順利 |
想要的效果:
id | userName | conclusionIds | conclusionNameStr |
---|---|---|---|
781918060586991616 | 夢琪 | 1,3 | 已成交,需要跟進 |
781986564770103296 | 西施 | 3 | 需要跟進 |
781989822074978304 | 火舞 | 2,3,4 | 暫無興趣,需要跟進,溝通順利 |
思考:
一般這種情況兩種方案:要么代碼層面處理,要么數據庫層面處理
1、方案一( 代碼層面):先查拜訪信息表,將數據返回到服務器,在代碼里進行切割,然后再去拜訪結論表里面去查詢對應的名稱,返回到程序進行處理拼接。造成頻繁訪問數據庫,或需要批量查回再匹配處理,這樣做雖然很簡單也很好理解但是效率太低。
2、方案二(數據庫):以mysql為例,使用FIND_IN_SET函數和GROUP_CONCAT函數進行查詢,但是數據量特別大時可能不友好,利用不上索引等
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:如果數據量特別大建議還是設計時不要逗號拼接設計,改成多表聯查,或者使用代碼層面處理
還是上述兩張表,想要的效果是每個結論出現頻次的統計,即統計逗號拼接的字符串中內容
偽代碼,具體根據情況拼接業務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
結果:
one | two | three | four |
---|---|---|---|
1 | 1 | 3 | 1 |
思考????: 模擬插入20萬數據,查看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);
經實驗,20w數據時相關查詢最慢2s左右,可接受范圍。
以上就是關于“Mysql逗號拼接字符串的關聯查詢及統計問題怎么解決”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。