如何随机匹配2个表中的行?
假设我有
Users
-----
u1
u2
u3
和
Items
-----
i1
i2
我想随机匹配/加入他们喜欢
Joined
------
u1 i2
u3 i1
请注意,结果表中的行是“随机”匹配。同样,大小是2个源表用户和项目中的较小者。
您希望基于不存在的关系(动态计算的“随机”值)将用户加入项目。
换句话说,对于每个用户,您都想选择随机项目。
假设主键序列中没有漏洞,则可以编写如下查询:
set @nb_items = select max(id) from items;
select users.id, items.id
from users
join items on items.id = floor(1 + rand() * @nb_items);
但是,此查询不会阻止为不同用户多次选择一项。
因此,解决此问题的另一种方法是实现这种“随机”关系。例如,您可以随机排列两个表,然后使用行号作为键将它们连接起来。这是查询,为清楚起见,使用了明确的表名:
set @i = 0;
set @j = 0;
select numbered_randomized_users.id, numbered_randomized_items.id
from (
select id, @i := @i + 1 as row_number
from (
select id from users order by rand()
) as randomized_users
) as numbered_randomized_users
join (
select id, @j := @j + 1 as row_number
from (
select id from items order by rand()
) as randomized_items
) as numbered_randomized_items using(row_number);
使用这种方法,结果集将仅是最小表的大小,而较大表中的某些行将被忽略。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句