MySQL随机匹配来自2个表/查询的行

时间:2015-11-11 11:25:22

标签: mysql

如何随机匹配2个表中的行?

假设我有

Users
-----
u1
u2
u3

并且

Items
-----
i1
i2

我想像

一样随机匹配/加入它们
Joined
------
u1   i2
u3   i1

请注意,结果表中的行是“随机”匹配。此外,大小是2个源表用户和项目中较小的一个。

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}}

希望这个帮助