【问题标题】:Error - "Result consisted of more than one row", due to GROUP BY错误 - “结果包含多行”,由于 GROUP BY
【发布时间】:2013-02-05 03:01:00
【问题描述】:

我有以下 MYSQL 存储过程,

CREATE PROCEDURE DWH.product_stats(OUT int_return INT)
BEGIN
  DECLARE vc_sku, 
      vc_prod_id    VARCHAR(100);

  DECLARE int_views,
      int_fav,
      int_month, 
      int_year, 
      not_found     INT DEFAULT 0;

 DECLARE cur_sku CURSOR FOR

 SELECT product_id, sku FROM product LIMIT 0,10;

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;

 OPEN cur_sku;
 REPEAT

FETCH cur_sku INTO vc_prod_id, vc_sku;
IF NOT not_found THEN
  -- Number of Views and Favs
  SELECT  COUNT(CASE WHEN event_type_id = 1 THEN 1 END) AS views,
          COUNT(CASE WHEN event_type_id = 5 THEN 1 END) AS favs,
          MONTH(logged_at) AS log_mon, 
          YEAR(logged_at) AS log_year INTO int_views, int_fav, int_month, int_year
  FROM report_event
  WHERE object_id = vc_prod_id
  GROUP BY log_mon, log_year
  ORDER BY log_year, log_mon; 

  -- DEBUG
  SELECT vc_sku, vc_prod_id, int_views, int_fav, int_month, int_year ;
END IF;
UNTIL not_found END REPEAT ;
CLOSE cur_sku;

END;

如果我正常运行,没有错误。我得到结果。但我在 MYSQL 存储过程中使用它。然后,当我尝试运行存储过程时,它给了我这个错误,说“结果由多行组成”。 这是因为我有一个针对月份和年份的 GROUP BY,它将为一个产品生成多个记录。但这就是我想要的功能。 处理此问题的最佳方法是什么?

【问题讨论】:

  • 你在什么样的程序中运行它?你想从SP返回什么?这个代码单独在一个过程中就可以了。
  • 好的,我刚刚添加了完整的 SP。我将把这个 SQL 的输出写到一个临时表中
  • 您缺少提供 SP 名称、它接受的参数以及它返回的内容的声明部分。我认为,这三项中至少一项对您的问题很重要。
  • 目前真的不需要任何参数,我有一个返回参数只是为了拥有一个,它真的没有任何作用,无论如何我已经添加了SP创建部分也是

标签: mysql sql group-by


【解决方案1】:

我认为我采取的方法是完全错误的,因为第二个 SQL 返回多行,要对结果做一些事情,我需要将它作为游标放在一起。所以我重写了SP如下,现在它工作正常,

DROP PROCEDURE IF EXISTS DWH.product_stats;
CREATE PROCEDURE DWH.product_stats(OUT int_return INT)
BEGIN
DECLARE vc_sku, 
      vc_prod_id    VARCHAR(100);

DECLARE not_found INT DEFAULT 0;

DECLARE cur_sku CURSOR FOR
  SELECT product_id, sku FROM product LIMIT 0,10;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;

OPEN cur_sku;
REPEAT
  FETCH cur_sku INTO vc_prod_id, vc_sku;
  IF NOT not_found THEN
  SET @vc_prod_id = vc_prod_id;
  -- Number of Views and Favs
  BEGIN
    DECLARE int_views,
            int_fav,
            int_month, 
            int_year INT;

    DECLARE not_found_ev INT DEFAULT 0;

    DECLARE cur_event CURSOR FOR
      SELECT  
        COUNT(CASE WHEN event_type_id = 1 THEN 1 END) AS views,
        COUNT(CASE WHEN event_type_id = 5 THEN 1 END) AS favs,
        MONTH(logged_at) AS log_mon, 
        YEAR(logged_at) AS log_year 
        FROM report_event
        WHERE object_id = @vc_prod_id
        GROUP BY log_mon, log_year
        ORDER BY log_year, log_mon;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found_ev = 1;  

      OPEN cur_event;

      report_event_loop : LOOP 

        FETCH cur_event INTO int_views, int_fav, int_month, int_year; 
        IF not_found_ev THEN
          CLOSE cur_event;
          LEAVE report_event_loop;
        END IF;
        -- DEBUG
        SELECT @vc_prod_id, vc_sku, vc_prod_id, int_views, int_fav, int_month, int_year ;
      END LOOP;
      SET not_found_ev = 0;
  END;
 END IF;
 UNTIL not_found END REPEAT ;
 CLOSE cur_sku;
END;

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多