· 5 years ago · May 20, 2020, 08:18 PM
1use mydb;
2SET GLOBAL log_bin_trust_function_creators = 1;
3
4-- Напишите процедуру, которая выводит тестовые вопросы из таблицы с полями id-test/id-quest/var1/var2/var3 в случайном порядке.
5-- Варианты ответов при этом для каждого вопроса также выводятся в случайном порядке.
6
7drop table if exists Test;
8create table if not exists Test (
9 id_test int,
10 id_quest int,
11 var1 varchar(45),
12 var2 varchar(45),
13 var3 varchar(45),
14 primary key(id_test, id_quest)
15);
16
17insert into Test value(1, 1, "var1_1", "var2_1", "var3_1");
18insert into Test value(1, 2, "var1_2", "var2_2", "var3_2");
19insert into Test value(2, 1, "var1_3", "var2_3", "var3_3");
20insert into Test value(2, 2, "var1_4", "var2_4", "var3_4");
21insert into Test value(3, 1, "var1_5", "var2_5", "var3_5");
22insert into Test value(3, 2, "var1_6", "var2_6", "var3_6");
23insert into Test value(3, 3, "var1_7", "var2_7", "var3_7");
24insert into Test value(4, 1, "var1_8", "var2_8", "var3_8");
25insert into Test value(4, 2, "var1_9", "var2_9", "var3_9");
26
27drop procedure if exists getRandomOrderedTest;
28DELIMITER //
29CREATE PROCEDURE getRandomOrderedTest()
30BEGIN
31 declare done integer default 0;
32
33 declare id_test int;
34 declare id_quest int;
35 declare var1 varchar(45);
36 declare var2 varchar(45);
37 declare var3 varchar(45);
38
39 declare varToSwap varchar(45); -- Переменная, сделанная для использования в смене мест varN и varM
40
41 declare tasksCount integer default 0; -- Количество записей в таблице. Используется для вычисления нового id в результирующей таблице (сделано для рандомного порядка)
42
43 declare tasksCursor Cursor for select Test.id_test, Test.id_quest, Test.var1, Test.var2, Test.var3 from Test;
44
45 declare continue handler for sqlstate '02000' SET done=1;
46
47 drop table if exists ResultTable; -- Создаём таблицу, в которую будем складывать подходящие вопросы
48 create table if not exists ResultTable(
49 id_test int,
50 id_quest int,
51 var1 varchar(45),
52 var2 varchar(45),
53 var3 varchar(45),
54 id int,
55 primary key(id, id_test, id_quest)
56 );
57
58 select count(*) from Test into tasksCount;
59 open tasksCursor;
60
61 while done = 0 do
62 fetch tasksCursor into id_test, id_quest, var1, var2, var3;
63
64 if(0.5 > rand()) then -- с вероятностью ~0.5 var1 и var3 поменяются местами
65 set varToSwap = var1;
66 set var1 = var3;
67 set var3 = varToSwap;
68 end if;
69
70 if(0.4 > rand()) then -- с вероятностью ~0.6 var2 и var3 поменяются местами
71 set varToSwap = var2;
72 set var2 = var3;
73 set var3 = varToSwap;
74 end if;
75
76 insert into ResultTable value(id_test, id_quest, var1, var2, var3, floor((1 + rand()) * tasksCount * 10));
77 -- Умножение было сделано для того, чтобы понизить вероятность возникновения одинаковых id в результирующей таблице из-за округления
78 end while;
79 close tasksCursor;
80
81END
82//
83DELIMITER ;
84
85call getRandomOrderedTest();
86select * from ResultTable;