如何根据mysql中的时区平均分配用户帐户?

时间:2013-04-23 00:15:51

标签: mysql distribution quicksort

我有1000个帐户。每个帐户都有account_name,account_id,time_zone_id

我想为每个帐户生成3个用户的活动。

因此,我需要为用户#10生成333活动,为用户#12生成333活动,为用户#12生成334活动。但我需要确保时区分配均匀。所以,如果我在时区10和时区10中拥有200个帐户,时区7中有200个帐户,时区39中有200个帐户,那么我想确保为用户平均分配这些新活动

我尝试过像这样的选择来计算,看看我是否正确的方向

SELECT count(ac.account_id) AS total, ac.time_zone_id,
(SELECT user_id FROM users where team_id = 4 ORDER BY RAND() LIMIT 1 ) AS user_id
FROM accounts AS ac
GROUP BY ac.time_zone_id

这创造了活动,但不是平等分配。

1 个答案:

答案 0 :(得分:1)

以下内容将为每个帐户返回user_no(10-12)。 它按time_zone_id排序,然后使用mod函数依次选择三个用户中的每一个(第一个结果为11个,第二个为11个,第三个为12个,第四个为10个,等等)。

set @r = 0 ;
select 
  @r:=@r+1 row_no, 
  account_id, 
  account_name,
  mod(@r,3)+10 user_no 
from 
  account 
order by 
  time_zone_id

<强>修订

你可以以类似的方式获得用户

set @ur = 0;
select 
  @ur:=@ur+1 user_row_no,
  user_id
from users
  where team_id = 4

再次修改

就像这样

制作一些示例数据

create table users( user_id int, team_id int) ;
insert into users select 2,4 
union select 3,4
union select 1,2
union select 7,4
union select 6,4;

create table account ( account_id int, 
                      account_name varchar(20),
                      time_zone_id varchar(3),
                      assigned_to int
                      );

insert into account(account_id ,account_name,time_zone_id)
select 1,'Janice','pst'
union select 2,'Jonny','gmt'
union select 3,'Jane','gmt'
union select 4,'Janet','pst'
union select 5,'James','gmt';

制作一个表格以弹出我们感兴趣的用户 (可能/应该是temp_table)

create table temp_user( id int AUTO_INCREMENT primary key,
                        user_id int
                       );


insert into temp_user( user_id ) 
select user_id 
from users 
where team_id = 4;

更新

set @r=0;

update account join 
(
    select 
      @r:=@r+1 row_no, 
      account_id, 
      account_name,
      assigned_to
    from 
      account 
    order by 
      time_zone_id
  ) x 
on x.account_id = account.account_id
join
  temp_user 
  on

    temp_user.id=(1+ mod(row_no,(select count(*) from temp_user)))
  set account.assigned_to = temp_user.user_id

http://sqlfiddle.com/#!2/164733/10