0

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

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

因此,我需要为已使用的#10 生成 333 个活动,为用户 #11 生成 333,为用户 #12 生成 334。但我需要确保时区分布均匀。因此,如果我在 18 时区有 200 个帐户,在 10 时区有 400 个帐户,在 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

这创造了活动,但分配不均。

4

1 回答 1

1

以下将为每个帐户返回一个 user_no ( 10-12 )。它按 time_zone_id 排序,然后使用 mod 函数依次选择三个用户中的每一个(第一个结果为用户 10,第二个结果为 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

于 2013-04-23T00:36:59.460 回答