【问题标题】:MySQL loop over distinct resultsMySQL循环不同的结果
【发布时间】:2021-12-26 18:03:44
【问题描述】:

我想创建一个循环选择不同值的过程,我有下面的示例代码,但在这种情况下,问题是最后一个值没有应用。循环在最后一个值之前停止,我不知道为什么。

CREATE PROCEDURE `my_procedure`()
BEGIN
  DECLARE bDone INT;
  DECLARE Var2 INT;

  DECLARE curs CURSOR FOR SELECT DISTINCT(id) FROM my_table WHERE deleted = 0 and status = 1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
  
 OPEN curs;
 SET bDone = 0; 
  REPEAT
    FETCH curs INTO Var2;
    IF Var2 THEN
        SELECT PR.some_value INTO @A FROM my_table2 PR WHERE PR.id = Var2 AND PR.status = 1 AND PR.deleted = 0;       
        SELECT PB.some_value INTO @B FROM my_table3 PB WHERE PB.id = Var2 AND PB.status = 1 AND PB.deleted = 0;
        SELECT MP.id INTO @C FROM my_table4 MP WHERE MP.id = Var2 AND MP.deleted = 0;
        IF @A THEN          
            IF @C THEN
                UPDATE my_table4 SET price = @A, modified = now() WHERE id = Var2;
            ELSE
                INSERT INTO my_table4 (id, price) VALUES (Var2, @A);
            END IF;
        ELSEIF @B THEN      
            IF @C THEN
                UPDATE my_table4 SET price = @B, modified = now() WHERE id = Var2;
            ELSE
                INSERT INTO my_table4 (id, price) VALUES (Var2, @B);
            END IF;
        END IF;
    END IF;
  UNTIL bDone END REPEAT;  
  CLOSE curs;
END

谢谢。

【问题讨论】:

    标签: mysql sql loops


    【解决方案1】:

    我以不同的方式解决了这个问题,我使用 while 代替光标并使用数据创建临时视图。

    CREATE PROCEDURE `my_procedure`()
    BEGIN
        DECLARE anyVariableName1 INT DEFAULT 0;
        DECLARE anyVariableName2 INT DEFAULT 0;
        DROP VIEW IF EXISTS temporary_view;
        CREATE VIEW temporary_view AS select distinct id from (select id from table2 where status = 1 and deleted = 0 union all select id from table1 where status = 1 and deleted = 0) a order by id;
        SELECT COUNT(*) FROM temporary_view INTO anyVariableName1;
        SET anyVariableName2 = 0;
        
        WHILE anyVariableName2 < anyVariableName1 DO
            SET @ID = null;
            SET @A = null;
            SET @B = null;
            SET @C = null;
            SELECT id INTO @ID from temporary_view offset LIMIT anyVariableName2,1;
            SELECT PR.B INTO @B FROM table1 PR WHERE PR.id = @ID AND PR.status = 1 AND PR.deleted = 0;
            SELECT PB.C INTO @C FROM table2 PB WHERE PB.id = @ID AND PB.status = 1 AND PB.deleted = 0;
            SELECT MP.id INTO @A FROM main_table MP WHERE MP.id = @ID AND MP.deleted = 0;
            IF @B THEN          
                IF @A THEN
                    UPDATE main_table SET price = @B, modified = now() WHERE id = @A;
                ELSE
                    INSERT INTO main_table (id, price) VALUES (@ID, @B);
                END IF;
            ELSEIF @C THEN      
                IF @A THEN
                    UPDATE main_table SET price = @C, modified = now() WHERE id = @A;
                ELSE
                    INSERT INTO main_table (id, price) VALUES (@ID, @C);
                END IF;
            END IF;
            SET anyVariableName2 = anyVariableName2 + 1;
        END WHILE; 
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2013-08-05
      相关资源
      最近更新 更多