>我有2个表。在table_1
我有不同的任务,每天都会更新。在table_2
,我有工人名单。我需要自动并随机地将 1 个工作人员 (table_2( 分配给 1 个任务 (table_1(,以便每个工人的任务数量大致相同。
我尝试使用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;
感谢您的任何帮助:)
我有 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( 进行更新
为了随机分配任务,我首先将任务随机化,然后通过简单地遍历工作线程数组列表并逐个将任务附加到它们来将它们分发给 workers。以下是我的意思。显然我没有您的代码的全部细节,但我希望它有所帮助。
// 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