#mysql
#mysql
Вопрос:
Я хочу написать скрипт, который позволит мне распределять случайные задания между 7 разными агентами. Ниже приведены мои 2 таблицы:
DROP TABLE IF EXISTS jobs;
CREATE TABLE `Jobs` (
`Job_id` SERIAL PRIMARY KEY,
`Start_Date` date DEFAULT NULL,
`End_Date` date DEFAULT NULL,
`Ref_no` int NOT NULL
) ;
INSERT INTO Jobs(Job_id,Start_Date, End_Date, Ref_no) VALUES
(1,'2018-09-01','2021-08-31',123456789),
(2,'2019-10-03','2020-10-02',987654321),
(3,'2020-11-01','2021-10-02',543210123),
(4,'2020-12-01','2022-11-30',481216181),
(5,'2018-04-01','2020-03-31',246810121),
(6,'2019-05-30','2020-05-29',369121518),
(7,'2019-11-01','2020-10-31',581114179);
DROP TABLE IF EXISTS agents;
CREATE TABLE `Agents` (
`Agent_id` SERIAL PRIMARY KEY,
`Agent_Name` varchar(255) NOT NULL UNIQUE
) ;
INSERT INTO Agents(Agent_id, Agent_Name) VALUES
(1,'Humpty'),
(2,'Mickey'),
(3,'Minnie'),
(4,'Daffy'),
(5,'Ellie'),
(6,'Jack'),
(7,'Jill');
Теперь я хотел бы написать скрипт, который случайным образом распределял бы задания по 7 агентам. Был бы очень признателен, если бы кто-нибудь мог посоветовать, как я мог бы начать это.
Заранее спасибо.
Комментарии:
1.
SELECT * FROM jobs ORDER BY RAND()
— и, пожалуйста, протестируйте весь код перед публикацией.2. Что вы пробовали до сих пор? Какой «скрипт» вы ищете — что-то, работающее с чистыми запросами MySQL?
3. Очень удобно, что у вас есть 7 заданий и 7 агентов — действительно ли это отражает вашу проблему?
4. Привет, P Salmon, приведенный выше пример набора данных, данные, которые будут разделены, будут равным количеством по 7 агентам, поэтому агентов будет нужное количество. Объем данных, когда я выполняю это против данных, когда они поступают, будет меняться.
Ответ №1:
В MySQL 8.x вы можете комбинировать RAND()
с ROW_NUMBER()
, чтобы связать случайные строки. Например:
select *
from (
select *, row_number() over(order by rand()) as rn
from `Jobs`
) j
join (
select *, row_number() over(order by rand()) as rn
from `Agents`
) a on j.rn = a.rn
Смотрите Пример выполнения в DB Fiddle.
Комментарии:
1. Спасибо, ребята, попробую ответы и отвечу.
Ответ №2:
Вот метод для версий MySQL до 8.0…
SELECT x.*
, MOD(@i:=@i 1,7) 1 i -- where '7' is the number of agents.
FROM
( SELECT j.*
FROM jobs j
ORDER
BY RAND()
) x
JOIN (SELECT @i := 0) vars
ORDER
BY i;
Пример вывода:
-------- ------------ ------------ ----------- ------
| Job_id | Start_Date | End_Date | Ref_no | i |
-------- ------------ ------------ ----------- ------
| 5 | 2018-04-01 | 2020-03-31 | 246810121 | 1 |
| 3 | 2020-11-01 | 2021-10-02 | 543210123 | 2 |
| 1 | 2018-09-01 | 2021-08-31 | 123456789 | 3 |
| 7 | 2019-11-01 | 2020-10-31 | 581114179 | 4 |
| 4 | 2020-12-01 | 2022-11-30 | 481216181 | 5 |
| 6 | 2019-05-30 | 2020-05-29 | 369121518 | 6 |
| 2 | 2019-10-03 | 2020-10-02 | 987654321 | 7 |
-------- ------------ ------------ ----------- ------