2015-11-11 45 views
1

如何随机匹配2个表中的行?MySQL与2个表匹配行/随机查询

假设我有

Users 
----- 
u1 
u2 
u3 

而且

Items 
----- 
i1 
i2 

我想随机匹配/加入他们喜欢

Joined 
------ 
u1 i2 
u3 i1 

注意的是,在最终表中的行是一个“随机“ 比赛。此外,大小是2个源表用户和项目中较小的一个。

+1

因此,对于每个项目您正在选择随机用户?或相反亦然? “加入”项必须是唯一的吗?那就是 - 结果是'(u1,i2),(u1,i1)'允许吗? –

+1

你有表中的整数主键吗? – rlanvin

+0

也许这个问题可以帮助你:http://stackoverflow.com/questions/28514736/how-to-select-a-random-row-with-a-group-by-clause –

回答

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); 

通过这种方法,结果集只会是最小的表的大小,并从更大的表中的某些行会被排除在外。

0

你可以用笛卡尔积和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} 

希望这有助于

+0

这不会阻止重复项正确吗?我想映射独特的行 –

+0

你不会有这对夫妻u.id,i.id的重复,因为笛卡尔产品将第一张表的所有行映射到第二行的所有行 –

+0

我猜他只想要每个项目在整个结果集中一次,而不是每个用户一次。 – rlanvin