0

私は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;

助けてくれてありがとう:)

4

2 に答える 2

0

タスクのランダムな割り当てを行うには、最初にタスクをランダム化し、次にワーカー配列のリストを繰り返し処理し、タスクを1つずつアタッチすることで、それらをワーカーに渡します。これが私が何を意味するかについての考えです。明らかに、私はあなたのコードの完全な詳細を持っていませんが、それが役立つことを願っています。

// 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
于 2012-05-18T13:15:32.150 に答える
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) を更新する必要があります。

于 2012-05-18T13:26:54.947 に答える