如何随机匹配2个表中的行?MySQL与2个表匹配行/随机查询
假设我有
Users
-----
u1
u2
u3
而且
Items
-----
i1
i2
我想随机匹配/加入他们喜欢
Joined
------
u1 i2
u3 i1
注意的是,在最终表中的行是一个“随机“ 比赛。此外,大小是2个源表用户和项目中较小的一个。
如何随机匹配2个表中的行?MySQL与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);
通过这种方法,结果集只会是最小的表的大小,并从更大的表中的某些行会被排除在外。
你可以用笛卡尔积和ORDER BY RAND()来做到这一点。要小心,在ORDER BY语句中使用RAND()会导致MySQL执行全表扫描,因此如果行数很多,性能将会很差。
SELECT u.id, i.id FROM users as u, items as i
ORDER BY RAND() LIMIT {smallest table size}
希望这有助于
这不会阻止重复项正确吗?我想映射独特的行 –
你不会有这对夫妻u.id,i.id的重复,因为笛卡尔产品将第一张表的所有行映射到第二行的所有行 –
我猜他只想要每个项目在整个结果集中一次,而不是每个用户一次。 – rlanvin
因此,对于每个项目您正在选择随机用户?或相反亦然? “加入”项必须是唯一的吗?那就是 - 结果是'(u1,i2),(u1,i1)'允许吗? –
你有表中的整数主键吗? – rlanvin
也许这个问题可以帮助你:http://stackoverflow.com/questions/28514736/how-to-select-a-random-row-with-a-group-by-clause –