MySQL存储过程中的循环
我需要编写一个脚本来创建和调用名为test的存储过程。该程序应计算10和20之间的公因数。要找到公因数,可以使用模运算符%检查一个数字是否可以平均分成两个数字。然后,此过程应显示一个字符串,该字符串显示如下常见因素: 10和20的共同因素:1 2 5提前感谢 以下是我到目前为止的情况:MySQL存储过程中的循环,mysql,loops,stored-procedures,modulo,Mysql,Loops,Stored Procedures,Modulo,我需要编写一个脚本来创建和调用名为test的存储过程。该程序应计算10和20之间的公因数。要找到公因数,可以使用模运算符%检查一个数字是否可以平均分成两个数字。然后,此过程应显示一个字符串,该字符串显示如下常见因素: 10和20的共同因素:1 2 5提前感谢 以下是我到目前为止的情况: `USE my_guitar_shop; DROP PROCEDURE IF EXISTS test; -- Change statement delimiter from semicolon to doub
`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(); `
一个没有循环的版本怎么样
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 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)
下面是在指定条件为真后退出的while循环的演示,或者在满足特定条件后手动退出的演示。试试看。另外,在这个循环中需要做什么?你从来没有提到过。例如,一个更健壮的解决方案应该有两个数字的参数,而不是静态的“10”和“20”。
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();