欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

背景:

數(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需要跟進
4溝通順利

想要的效果:

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

思考??:

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

1、方案一( 代碼層面):先查拜訪信息表,將數(shù)據(jù)返回到服務(wù)器,在代碼里進行切割,然后再去拜訪結(jié)論表里面去查詢對應(yīng)的名稱,返回到程序進行處理拼接。造成頻繁訪問數(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ù)量特別大建議還是設(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 ;  -- 改回默認的 MySQL delimiter:';'

CALL t_conclusion_detail_memory(200000); 

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

總結(jié)

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

相關(guān)文章

  • MySQL 原理與優(yōu)化之Update 優(yōu)化

    MySQL 原理與優(yōu)化之Update 優(yōu)化

    這篇文章主要介紹了MySQL 原理與優(yōu)化之Update 優(yōu)化,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-08-08
  • CentOS下重啟Mysql的各種方法(推薦)

    CentOS下重啟Mysql的各種方法(推薦)

    這篇文章主要介紹了CentOS下重啟Mysql的各種方法(推薦),非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • 刪除MySQL中所有表的外鍵的兩種方法

    刪除MySQL中所有表的外鍵的兩種方法

    這篇文章主要介紹了刪除MySQL中所有表的外鍵的兩種方法,文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • CentOS下徹底卸載mysql的方法

    CentOS下徹底卸載mysql的方法

    這篇文章主要為大家詳細介紹了CentOS下徹底卸載mysql的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • MySQL 5.7新特性介紹

    MySQL 5.7新特性介紹

    這篇文章主要為大家詳細介紹了MySQL 5.7新特性,了解一下MySQL 5.7的部分新功能,需要的朋友可以參考下
    2016-06-06
  • Mysql空值處理函數(shù)詳解

    Mysql空值處理函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于Mysql空值處理函數(shù)的相關(guān)資料,在MySQL數(shù)據(jù)庫中,空值問題是經(jīng)常遇到的一個問題,空值是指在某個字段中沒有數(shù)據(jù)或者數(shù)據(jù)為NULL,需要的朋友可以參考下
    2023-08-08
  • MySQL多表關(guān)聯(lián)查詢方式及實際應(yīng)用

    MySQL多表關(guān)聯(lián)查詢方式及實際應(yīng)用

    MySQL語句學習的難點和重點就在于多表查詢,同時MySQL也有諸多方法供大家選擇,不論是多表聯(lián)查(聯(lián)結(jié)表、左連接、右連接……),這篇文章主要給大家介紹了關(guān)于MySQL多表關(guān)聯(lián)查詢方式及實際應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 詳解MySql存儲過程參數(shù)的入門使用

    詳解MySql存儲過程參數(shù)的入門使用

    這篇文章主要介紹了MySql存儲過程參數(shù)的入門使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • MySQL中查詢某一天, 某一月, 某一年的數(shù)據(jù)代碼詳解

    MySQL中查詢某一天, 某一月, 某一年的數(shù)據(jù)代碼詳解

    本文通過實例代碼給大家介紹了MySQL中, 如何查詢某一天, 某一月, 某一年的數(shù)據(jù) ,需要的朋友可以參考下
    2019-06-06
  • 詳解MySQL插入和查詢數(shù)據(jù)的相關(guān)命令及語句使用

    詳解MySQL插入和查詢數(shù)據(jù)的相關(guān)命令及語句使用

    這篇文章主要介紹了MySQL插入和查詢數(shù)據(jù)的相關(guān)命令及語句使用,包括相關(guān)的PHP腳本操作方法講解也很詳細,需要的朋友可以參考下
    2015-11-11

最新評論