简体   繁体   English

MySQL存储过程中的循环

[英]Loops within MySQL Stored procedures

I need to write a script that creates and calls a stored procedure named test. 我需要编写一个脚本来创建和调用名为test的存储过程。 This procedure should calculate the common factors between 10 and 20. To find a common factor, you can use the modulo operator (%) to check whether a number can be evenly divided into both numbers. 此过程应计算10到20之间的公因子。要查找公因子,可以使用模运算符(%)检查数字是否可以均匀地分成两个数字。 Then, this procedure should display a string that displays the common factors like this: Common factors of 10 and 20: 1 2 5 Thanks in advance! 然后,此过程应显示一个字符串,显示如下常见因素:公共因子10和20:1 2 5提前感谢!

Here is what I have so far: 这是我到目前为止:

`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(); `

How about a version without loops? 没有循环的版本怎么样?

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;

Usage: 用法:

mysql> CALL test(10, 20);
+---------------------------------------+
| result                                |
+---------------------------------------+
| Common factors of 10 and 20: 1,2,5,10 |
+---------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> CALL test(800, 1000);
+------------------------------------------------------------------+
| result                                                           |
+------------------------------------------------------------------+
| Common factors of 800 and 1000: 1,2,4,5,8,10,20,25,40,50,100,200 |
+------------------------------------------------------------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

Here is SQLFiddle demo 这是SQLFiddle演示

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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM