如何随机匹配2个表中的行?
假设我有
Users
-----
u1
u2
u3
并且
Items
-----
i1
i2
我想像
一样随机匹配/加入它们Joined
------
u1 i2
u3 i1
请注意,结果表中的行是“随机”匹配。此外,大小是2个源表用户和项目中较小的一个。
答案 0 :(得分: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);
使用这种方法,结果集只会是最小表的大小,而较大表中的某些行将被省略。
答案 1 :(得分:0)
您可以使用笛卡儿积和ORDER BY RAND()来完成此操作。注意,在ORDER BY语句中使用RAND()会导致MySQL执行全表扫描,因此如果你有很多行,性能会很差。
{{1}}
希望这个帮助