我有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
这创造了活动,但不是平等分配。
答案 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