table_1
我有不同的任务,每天都在更新。在table_2
我有工人名单。我需要自动并随机地将1个worker(table_2)分配给1个任务(table_1),这样每个worker都将拥有大约相同数量的任务。
我尝试使用rand()
方法,它随机分配但不均等,我的意思是一个工作人员可以完成比另一个工作更多的任务。然后我尝试使用count()
方法,但无法连接它们......我是php和mysql的新手:(
我做了类似的东西,但只在mysql中,但由于(不在)函数,它只能工作一次。
insert into table_1(worker)
select col_1 from table_2
where col_1 not in (select worker from table_1)
order by col_1 rand()
limit 0,1;
感谢您的帮助:)
答案 0 :(得分:0)
要对任务进行随机分配,我首先将任务随机化,然后通过简单地遍历工作线阵列列表并将任务一个接一个地附加到它们,将它们交给工作人员。这是我的意思。显然我没有完整的代码细节,但我希望它有所帮助。
// assuming you already have a list of tasks and workers fetched from the database
// and flattened into simple integer indexed arrays. I'll call them $workers
// and $tasks
// create an array of tasks per worker
$worker_tasks = array();
// randomize the tasks
shuffle($tasks); // built in php function
while(!empty($tasks)){
foreach($workers as $worker){
if(empty($tasks)) break;
// add a new task under the worker
$worker_tasks[$worker][] = array_pop($tasks);
}
}
// insert the array of worker_tasks into w/e table you want.
// high five everyone
答案 1 :(得分:0)
我有2个解决方案。第一种方法更简单,但前提是您可以修改table_2以为当前分配的任务数添加字段。它将是一个计数器,您将初始化为0,然后在每次分配任务时递增。如果您可以修改表格,则会选择分配了最少任务的工作人员:
select worker_id, MIN(tasks_assigned)
FROM table_2
GROUP BY worker_id
这是一个循环分配器,但它不是随机的。我认为公平的任务更重要。如果你不能改变你的表,同样的解决方案会更麻烦:
CREATE TEMPORARY TABLE task_list
( worker_id INT,
tasks_assigned INT )
SELECT INTO task_list
SELECT worker_id, count(worker_id) AS tasks_assigned
FROM table_1
GROUP BY worker_id
SELECT INTO task_list
SELECT worker_id, 0
FROM table_2
WHERE worker_id NOT IN (SELECT worker_id FROM task_list)
SELECT worker_id MIN(tasks_assigned)
FROM task_list
GROUP BY worker_id
显然这不是整个解决方案。但是这会给你一个worker_id,它分配的任务数量最少。然后,您必须使用此ID对任务表(table_1)进行更新