【问题标题】:Group_Concat used in mysql cursor returning wrong resultmysql游标中使用的Group_Concat返回错误结果
【发布时间】:2018-04-04 07:48:17
【问题描述】:

以下代码应为 csv2 生成 3 个条目……但是生成了 6 个条目。

这是为什么呢?代码正在进行中。

创建代码:

Create table testing(
  idString varchar(20),
  region varchar(20)
);

insert into testing values("abcdefg","123456");
insert into testing values("bcdefgh","123456");
insert into testing values("cdefghi","123456");
insert into testing values("defghij","456789");
insert into testing values("efghijk","456789");
insert into testing values("fghijkl","456789");

要运行的代码:

DROP PROCEDURE IF EXISTS `sp_split`;
DROP PROCEDURE IF EXISTS `getCombinations`;

CREATE TABLE IF NOT EXISTS `temp` (
  `col` VARCHAR(100) NOT NULL
) ENGINE=MEMORY;

CREATE TABLE IF NOT EXISTS `result` (
  `col1` VARCHAR(100) NOT NULL
) ENGINE=MEMORY;


CREATE PROCEDURE getCombinations()
  BEGIN

    DECLARE countInt INT DEFAULT 0;
    DECLARE csv varchar(100);
    DECLARE region varchar(100);
    DECLARE v_last_row_fetched INT;
    declare v_counter int unsigned default 1;

    DECLARE counter cursor for
      select  * from ( select region as region,
                              count(distinct idString) as countInt,
                              group_concat(idString) as csv
                          from testing
                          group by region ) temp;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET  v_last_row_fetched=1;
    SET SESSION sql_mode = CONCAT(@@sql_mode, ',PIPES_AS_CONCAT');

    delete from result;
    open counter;
    c1_loop: loop
      fetch counter into region , countInt, csv ;


      IF  v_last_row_fetched=1 THEN LEAVE c1_loop; END IF;

      #DEBUG STATEMENT HERE - 6 values instead of two displayed for csv3
      select csv as csv3;
      LEAVE c1_loop;

    end loop c1_loop;
    close counter;

  END;

DELIMITER ;

CALL getCombinations();
SET SESSION sql_mode = CONCAT(@@sql_mode, ',PIPES_AS_CONCAT');

【问题讨论】:

  • SET sql_mode='PIPES_AS_CONCAT'; 非常不安全,因为它会关闭您可能需要的其他 sql 模式...更好的是使用 SET SESSION sql_mode = CONCAT(@@sql_mode, ',PIPES_AS_CONCAT');
  • @Raymond Nijland 谢谢。知道为什么所有元素都被连接而不是三个吗?似乎 group by 几乎被忽略了。
  • 如果你有一个无条件的leave c1_loop;语句,循环运行代码有什么意义?
  • @Barmar 我正在调试。显然代码不完整。只是 group_concat 连接所有值而不是 group by region。在解决当前问题后,我并没有花时间删除我将实际使用的所有东西。
  • 我看到了问题,你有一个名为region的局部变量。

标签: mysql stored-procedures cursor mariadb


【解决方案1】:

问题是您有一个名为region 的局部变量,它被用在GROUP BY region 而不是列中。所以就好像你写了GROUP BY null,所以所有的东西都组合在一起了。

更改region 变量的名称,它将起作用。一般来说,避免使用与表列同名的变量,这通常会导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2019-08-20
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多