最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql逗號(hào)拼接字符串的關(guān)聯(lián)查詢以及統(tǒng)計(jì)問題

 更新時(shí)間:2023年03月04日 11:49:53   作者:一只IT攻城獅  
有時(shí)為了數(shù)據(jù)庫簡潔,存放數(shù)據(jù)的時(shí)候,某一字段采用逗號(hào)隔開的形式進(jìn)行存儲(chǔ),下面這篇文章主要給大家介紹了關(guān)于Mysql逗號(hào)拼接字符串的關(guān)聯(lián)查詢以及統(tǒng)計(jì)問題的相關(guān)資料,需要的朋友可以參考下

背景:

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

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

一、查詢問題

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é)論表里面去查詢對(duì)應(yīng)的名稱,返回到程序進(jìn)行處理拼接。造成頻繁訪問數(shù)據(jù)庫,或需要批量查回再匹配處理,這樣做雖然很簡單也很好理解但是效率太低。

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

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è)計(jì)時(shí)不要逗號(hào)拼接設(shè)計(jì),改成多表聯(lián)查,或者使用代碼層面處理

二、統(tǒng)計(jì)問題

還是上述兩張表,想要的效果是每個(gè)結(jié)論出現(xiàn)頻次的統(tǒng)計(jì),即統(tǒng)計(jì)逗號(hào)拼接的字符串中內(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é)論(多個(gè)結(jié)論逗號(hào)分隔)'
  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)實(shí)驗(yàn),20w數(shù)據(jù)時(shí)相關(guān)查詢最慢2s左右,可接受范圍。

總結(jié)

到此這篇關(guān)于Mysql逗號(hào)拼接字符串的關(guān)聯(lián)查詢以及統(tǒng)計(jì)問題的文章就介紹到這了,更多相關(guān)Mysql逗號(hào)拼接字符串查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

刚察县| 射洪县| 陕西省| 五大连池市| 邮箱| 伊春市| 彩票| 嵊州市| 吉首市| 哈密市| 正蓝旗| 谢通门县| 石景山区| 嘉荫县| 中方县| 壤塘县| 丰都县| 罗定市| 威远县| 松阳县| 皮山县| 金门县| 贞丰县| 延吉市| 安宁市| 阿克苏市| 铜川市| 乡宁县| 肥西县| 永胜县| 镇康县| 东阳市| 禹城市| 闸北区| 交城县| 安吉县| 金溪县| 沂源县| 红安县| 游戏| 潼南县|