如何在 MySQL 中随机加入表格?

How to join tables randomly in MySQL?

我有两个表(TableATableB
TableA 有 10 行,TableB 有 50 行。
我希望 TableA 中的每一行与来自 TableBX 行随机连接。

例如,如果 TableA 有行 (a,b,c)TableB 有行 (p,q,r,s,t,u)X=2,那么预期结果是:

a-p
a-u
b-r
b-t
c-s
c-q

这种加入应该是随机的。

您可以使用 RAND() :

select x,y from 
(
    select t.*,  @rownum := @rownum + 1 AS rank from
    (
        select tablea.x, tableb.y, rand() r
        from tablea cross join tableb
         order by x, r
    ) t, (SELECT @rownum := -1) r
) tr
where tr.rank%(select count(y) from tableB)<2

在上面的查询中,我将 tableA 中的每个元素与 tableB 中的每个元素连接起来。对于每个这样的行,计算 RAND() 值。然后 table 将按此排名对 tableA 中的每个值进行排序。然后我只需要 select 第一行 X 每个值的行。

此查询中的号码 2 是您的 X

你可以在SQL Fiddle

中看到它

编辑:

我找到了 tableB 个元素不重复的解决方案:

select ta.x, tb.y from 
(
   select y, @rownumB := @rownumB + 1 as rnB 
   from  
   (select y, rand() as r from tableB order by r) t, (SELECT @rownumB := -1) rownB
) tb,
(
   select x, @rownumA := @rownumA + 1 as rnA
   from tableA, (SELECT @rownumA := -1) rownA
) ta
where tb.rnB%5=ta.rnA
order by ta.x;

以上查询:

  • 随机播放 tableB
  • 将行号 rnB (0..14) 分配给打乱后的行 tableB
  • 将行号 rnA (0..4) 分配给 tableA
  • 的行
  • 使用 % 运算符
  • 将 'tableB' 与 tableA 连接起来
  • tableB 有 15 个元素。所以 rnB%5 会给出数字 (0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)。这些数字与 rnA 相连。所以 tableA 中的每一行都与 tableB
  • 中的 3 行相连

SQLFiddle

中查看