如何在 MySQL 中随机加入表格?
How to join tables randomly in MySQL?
我有两个表(TableA
和 TableB
)
TableA
有 10 行,TableB
有 50 行。
我希望 TableA 中的每一行与来自 TableB
的 X
行随机连接。
例如,如果 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 行相连
中查看
我有两个表(TableA
和 TableB
)
TableA
有 10 行,TableB
有 50 行。
我希望 TableA 中的每一行与来自 TableB
的 X
行随机连接。
例如,如果 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' 与 tableB
有 15 个元素。所以rnB%5
会给出数字 (0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)。这些数字与rnA
相连。所以tableA
中的每一行都与tableB
中的 3 行相连
tableA
连接起来