天下之事,必先处之难,而后易之。

QA: mysql group_concat长度限制

 SQL查询修改

-- 查找当前数据库长度
show variables like 'group_concat_max_len' 
-- 设置当前session的group_concat长度,其他session连接不受影响
SET SESSION group_concat_max_len = 10240;
-- 设置全局group_concat长度
SET GLOBAL group_concat_max_len = 10240
[Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation
当前mysql用户不允许,请联系DBA。DBA可能告诉你,长度太长了,性能差,还可能挂。

Java执行修改

stmt = conn.createStatement(); // 当前的JDBC连接

stmt.execute("set session group_concat_max_len = 150000");

 注意:group_concat长度不够会导致结果丢弃。

比如下面的存储过程:

CREATE DEFINER=`jlslyt`@`%` PROCEDURE `batchGetNsjgTreeList`(
    dwCode VARCHAR (20),
    rootId VARCHAR (1000),
    isParent INT,
    haveSelf INT
)
BEGIN
    # isParent    0:查询子节点 1:查询父节点 2:返回经过节点的父节点以及子节点。
    #    haveSelf    0: 不包含自身 1:包含自身a
DECLARE nsjgIds_all TEXT ;
DECLARE tableName VARCHAR (100) ;
DECLARE fieldName VARCHAR (100) ;
DECLARE whereFieldName VARCHAR (100) ; # 记录所有的ID。
SET nsjgIds_all =
IF (
    haveSelf = 1,
    CAST(rootId AS CHAR),
    ""
) ; loop_start :
LOOP

SET fieldName =
IF (
    isParent = 0,
    'NSJGID',
    'PARID'
) ;
SET tableName = CONCAT(
    "XH_NSJG_TB",

IF (LENGTH(dwCode) > 0, "_", ""),
 dwCode
) ;
SET whereFieldName =
IF (
    isParent > 0,
    'NSJGID',
    'PARID'
) ;
SET @nsjgIds = CAST(rootId AS CHAR) ;
SET @curSql = CONCAT(
    "SELECT GROUP_CONCAT(",
    fieldName,
    ") INTO @nsjgIds FROM ",
    tableName,
    " WHERE FIND_IN_SET (",
    whereFieldName,
    ",?)"
) ; # 循环查询所有节点
WHILE LENGTH(@nsjgIds) > 0 DO
    PREPARE stmt
FROM
    @curSql ; EXECUTE stmt USING @nsjgIds ; DEALLOCATE PREPARE stmt ;
IF @nsjgIds IS NOT NULL THEN

SET nsjgIds_all = CONCAT(
    nsjgIds_all,

IF (LENGTH(nsjgIds_all), ",", "") ,@nsjgIds
) ;
END
IF ;
END
WHILE ;
SET isParent = isParent - 2 ;
IF isParent < 0 THEN
    LEAVE loop_start ;
END
IF ;
END
LOOP
    ;
SET @curSql = CONCAT(
    "SELECT * FROM ",
    tableName,
    " WHERE NSJGID IN (",
    nsjgIds_all,
    ")"
) ; PREPARE stmt
FROM
    @curSql ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
END


-----------------------------------------------------------------------------------------------------------


DELIMITER $$

USE `xht_ywp`$$

DROP PROCEDURE IF EXISTS `batchGetNsjgTreeList`$$

CREATE DEFINER=`dlwy`@`%` PROCEDURE `batchGetNsjgTreeList`(dwCode VARCHAR(20),rootId VARCHAR(1000),isParent INT, haveSelf INT)
BEGIN 

    # isParent    0:查询子节点 1:查询父节点 2:返回经过节点的父节点以及子节点。

    #    haveSelf    0: 不包含自身 1:包含自身a

    DECLARE nsjgIds_all TEXT;

    DECLARE    tableName VARCHAR(100);

    DECLARE    fieldName VARCHAR(100);

    DECLARE    whereFieldName VARCHAR(100);

    # 记录所有的ID。

    SET nsjgIds_all = IF(haveSelf=1,CAST(rootId AS CHAR),"");

    loop_start : LOOP

        SET fieldName = IF(isParent=0,'NSJGID','PARID');

        SET tableName = CONCAT("XH_NSJG_TB",IF(LENGTH(dwCode)>0,"_",""),dwCode);

        SET whereFieldName = IF(isParent>0,'NSJGID','PARID');

        SET @nsjgIds = CAST(rootId AS CHAR);

        SET @curSql = CONCAT("SELECT GROUP_CONCAT(",fieldName,") INTO @nsjgIds FROM ",tableName," WHERE FIND_IN_SET (",whereFieldName,",?)");

        # 循环查询所有节点

        WHILE LENGTH(@nsjgIds) > 0 DO 

            PREPARE stmt FROM @curSql;

            EXECUTE stmt USING @nsjgIds;

            DEALLOCATE PREPARE stmt; 

            IF @nsjgIds IS NOT NULL THEN

                SET nsjgIds_all = CONCAT(nsjgIds_all,IF(LENGTH(nsjgIds_all),",",""),@nsjgIds);
                

            END IF;

        END WHILE;  

        SET isParent = isParent - 2;

        IF isParent < 0 THEN  

            LEAVE loop_start;

        END IF;  

    END LOOP;  

    SET @curSql = CONCAT("SELECT * FROM ",tableName," WHERE NSJGID IN (",nsjgIds_all,")");

    PREPARE stmt FROM @curSql;

    EXECUTE stmt ;

    DEALLOCATE PREPARE stmt;

END$$

DELIMITER ;

 

posted @ 2020-12-10 15:31  boonya  阅读(194)  评论(0编辑  收藏  举报
我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。