欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql存储过程 巩固(一张表的取多个双色球号码)

程序员文章站 2022-07-14 20:25:38
...

一、双色球规则 :六个红球分别是从 1~33  一个篮球1~16 
二、双色球表 shuang_se 
二、思路:①利用MySQL 的 RAND( ) 函数取随机数
                  ②创建一个临时表TMP_TEST1含有一个主键自增长的列 与存放随机数的列用 WHILE 取出来的随机数 33个 插入表中
                  ③ 在创建一个与TMP_TEST1结构相

WHILE
            RW > 0 DO#循环开始
            
            SET NM =  ROUND( RAND( ) * 33 ) ;#随机数种子
        INSERT INTO TMP_TEST1 ( `NUM` )
        VALUES
            ( NM );#写入临时表
        SET RW = RW - 1;    
    END WHILE;

同的临时表TMP_TEST2 
                  ④将TMP_TEST1中根据随机数列 排序后得到了 1·33中的随机数
                  ⑤在通过随机数取1~27 的随机数 用limt 取33个随机6个连续数据 并插入TMP_TEST2 临时表中
                  ⑥然后通过CASE  ... WHEN .. 与一个1~16的随机数 插入shuang_se表中 
                  ⑦循环条用的改以上步骤的存储过成
 四、 实例                              
1、首先创建一个表 shuang_se 
  

DELIMITER //
/*创建生成随机数存储过程*/
DROP PROCEDURE
IF
	EXISTS RD1 // CREATE PROCEDURE RD1 ( ) 
	BEGIN
	DECLARE
		NM INT;#定义变量
	DECLARE
		RW INT;#定义变量
	DECLARE
		MN INT;#定义变量
/*创建需要用到临时表1*/
	DROP TABLE
	IF
		EXISTS TMP_TEST1;
	CREATE TEMPORARY TABLE TMP_TEST1 ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
	CHARSET = utf8;
/*创建需要用到临时表2*/
	DROP TABLE
	IF
		EXISTS TMP_TEST2;
	CREATE TEMPORARY TABLE TMP_TEST2 ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
	CHARSET = utf8;
	
	SET RW = 33;#循环去随机数的次数
	
	SET MN = ROUND( RAND( ) * 27 );#从表2中分页的开始值
	WHILE
			RW > 0 DO#循环开始
			
			SET NM =  ROUND( RAND( ) * 33 ) ;#随机数种子
		INSERT INTO TMP_TEST1 ( `NUM` )
		VALUES
			( NM );#写入临时表
		SET RW = RW - 1;	
	END WHILE;
	INSERT INTO TMP_TEST2 ( `NUM` ) SELECT
	ID 
	FROM
		TMP_TEST1 
	ORDER BY
		NUM ASC LIMIT MN,6;#从临时表1转移数据到临时表2通过order by来生成随机数

	#SELECT * FROM TMP_TEST2;
	INSERT INTO shuang_se (red1,red2,red3,red4,red5,red6,blue)
	SELECT
	MAX(CASE ID WHEN 1 THEN NUM ELSE 0 END) red1,
	MAX(CASE ID WHEN 2 THEN NUM ELSE 0 END) red2,
	MAX(CASE ID WHEN 3 THEN NUM ELSE 0 END) red3,
	MAX(CASE ID WHEN 4 THEN NUM ELSE 0 END) red4,
	MAX(CASE ID WHEN 5 THEN NUM ELSE 0 END) red5,
	MAX(CASE ID WHEN 6 THEN NUM ELSE 0 END) red6,
	ROUND( RAND( ) * 16 ) blue
	FROM TMP_TEST2; /**将列转换成行并赋值到shuang_se表中**/	
END; // #存储过程结束

CREATE procedure RD2() 
BEGIN
DECLARE i INT; 
SET i = 0;  
WHILE i<5 DO 
call RD1();
SET i = i+1;   
END WHILE; 
END;
CALL RD2 ( ) // #调用存储过程**/

DROP PROCEDURE RD1 // #删除存储过程
DROP PROCEDURE RD2 // #删除存储过程
DELIMITER;

五、解析
1、创建存储过程 RD1

DROP PROCEDURE IF EXISTS RD1  #创建之前先删除有重复名称的存储过程
CREATE PROCEDURE RD1 ( ) 
    BEGIN
    END


2、NM  临时表2 LIMT 开始值 ,RW 循环插入临时表1的是次数 、MN 表1 中随机数列
3、  创建临时表1

 DROP TABLE IF
    CREATE TEMPORARY TABLE TMP_TEST1 ( I
D INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
    CHARSET = utf8;


4、创建临时表2

DROP TABLE IF
        EXISTS TMP_TEST2;
    CREATE TEMPORARY TABLE TMP_TEST2 ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
    CHARSET = utf8;


5、循环插入33个数
  
   6、从33个随数中去 6个值赋值到 表1

INSERT INTO TMP_TEST2 ( `NUM` ) SELECT
    ID 
    FROM
        TMP_TEST1 
    ORDER BY
        NUM ASC LIMIT MN,6;


7、将临时表1的数据行边成列 并加入一个1~16的随机数 写入临时表2 并

INSERT INTO shuang_se (red1,red2,red3,red4,red5,red6,blue)
    SELECT
    MAX(CASE ID WHEN 1 THEN NUM ELSE 0 END) red1,
    MAX(CASE ID WHEN 2 THEN NUM ELSE 0 END) red2,
    MAX(CASE ID WHEN 3 THEN NUM ELSE 0 END) red3,
    MAX(CASE ID WHEN 4 THEN NUM ELSE 0 END) red4,
    MAX(CASE ID WHEN 5 THEN NUM ELSE 0 END) red5,
    MAX(CASE ID WHEN 6 THEN NUM ELSE 0 END) red6,
    ROUND( RAND( ) * 16 ) blue
    FROM TMP_TEST2; /**将列转换成行并赋值到shuang_se表中**/  

 
7、写一个循环调用的 RD1 的存储过程 并删除创建的存储过程
 

CREATE procedure RD2() 
BEGIN
DECLARE i INT; 
SET i = 0;  
WHILE i<5 DO 
call RD1();
SET i = i+1;   
END WHILE; 
END;
CALL RD2 ( ) // #调用存储过程**/

DROP PROCEDURE RD1 // #删除存储过程
DROP PROCEDURE RD2 // #删除存储过程