【问题标题】:Loops within MySQL Stored proceduresMySQL存储过程中的循环
【发布时间】:2013-11-13 22:39:50
【问题描述】:

我需要编写一个脚本来创建和调用名为 test 的存储过程。此过程应计算 10 到 20 之间的公因数。要找到公因数,可以使用模运算符 (%) 检查一个数是否可​​以均分为两个数。然后,此过程应显示一个字符串,该字符串显示如下共同因素: 10 和 20 的公因数:1 2 5 先谢谢了!

这是我目前所拥有的:

`USE my_guitar_shop;

DROP PROCEDURE IF EXISTS test;

-- Change statement delimiter from semicolon to double front slash
DELIMITER //

CREATE PROCEDURE test()
BEGIN
  DECLARE counts   INT Default 1;
  DECLARE factor10;
  DECLARE factor20;
  DECLARE FACTORS varchar(100);

  simple_loop: LOOP

  SELECT 10
  MOD counts
  into factor10;
  SELECT 20
  MOD counts
  into factor20;

    WHEN (factor10 = 0 && factor20 = 0) THEN
    SELECT concat("Common factors of 10 and 20:";
WHEN
END//

-- Change statement delimiter from semicolon to double front slash
DELIMITER ;

CALL test(); `

【问题讨论】:

标签: mysql loops stored-procedures modulo


【解决方案1】:

没有循环的版本怎么样?

CREATE PROCEDURE test(IN _first INT, _second INT)
SELECT CONCAT('Common factors of ', LEAST(_first, _second), ' and ', GREATEST(_first, _second), ': ', GROUP_CONCAT(n)) result
  FROM
(
  SELECT n
    FROM 
  (
    SELECT a.N + b.N * 10 + c.N * 100 + 1 n
      FROM 
     (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c
     ORDER BY n
  ) n
   WHERE n <= LEAST(_first, _second)
  HAVING _first  MOD n = 0 
     AND _second MOD n = 0
) q;

用法:

mysql> CALL 测试(10, 20); +----------------------------------------------------+ |结果 | +----------------------------------------------------+ | 10 和 20 的公因数:1,2,5,10 | +----------------------------------------------------+ 一组中的 1 行(0.00 秒) 查询正常,0 行受影响(0.00 秒) mysql> 调用测试(800, 1000); +-------------------------------------------------- -----------------+ |结果 | +-------------------------------------------------- -----------------+ | 800和1000的公因数:1,2,4,5,8,10,20,25,40,50,100,200 | +-------------------------------------------------- -----------------+ 一组中的 1 行(0.01 秒) 查询正常,0 行受影响(0.01 秒)

这里是SQLFiddle演示

【讨论】:

    【解决方案2】:
    USE my_guitar_shop;
    
    DROP PROCEDURE IF EXISTS test;
    
    DELIMITER //
    
    CREATE PROCEDURE test()
    BEGIN
        DECLARE factor10 INT;
        DECLARE factor20 INT;
        DECLARE counter INT;
        DECLARE result VARCHAR(50);
    
        SET factor10 = 10;
        SET factor20 = 20;
        SET counter = 1;
        SET result = 'Common factors of 10 and 20: ';
    
        WHILE (counter <= factor10/2) DO
    
            IF (factor10 % counter = 0 AND factor20 % counter = 0) THEN
                SET result = CONCAT(result, counter, ' ');
            END IF;
    
           SET counter = counter+1;
        END WHILE;
    
    /*  IF (factor10 % factor10 = 0 AND factor20 % factor10 = 0) THEN
            SET result = CONCAT(result, factor10, ' ');
        END IF;
    */
        SELECT result AS message;
    END //
    
    DELIMITER ;
    
    CALL test();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-05
      • 2013-08-05
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2013-06-20
      • 2013-03-04
      • 1970-01-01
      相关资源
      最近更新 更多