mysql - 如何从多列中提取随机行并将它们插入另一个表?
问题描述
我正在尝试将三个不同表中的行合并到另一个表中。我已经在我的 db-fiddle 表和下面的查询中复制了这个。我的问题是,如果每个表中有 3 行,那么我应该有 27 种可能的组合,但我只得到 3 个。我理解为什么我只得到 3 个,但我不知道如何改变它来做我想做的事想。就像现在一样,如果选择的随机数是 3,它会从每个表中提取 id = 3。我希望每个表的数字是随机的。
练习表和查询
create table First (id int(10), first varchar(255));
Insert into First (id, first) values (1, 'John'), (2, 'Bill'), (3, 'Chad');
create table Middle (id int(10), middle varchar(255));
Insert into Middle (id, middle) values (1, 'Ethan'), (2, 'Dave'), (3, 'Ron');
create table Last (id int(10), last varchar(255));
Insert into Last (id, last) values (1, 'Smith'), (2, 'Miller'), (3, 'Darnold');
create table Full (id int(10) auto_increment primary key, full varchar(255));
insert into Full (id) values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
Update Full u1
join (select id,
@i:=Floor(1+ RAND() * 3),
(select concat(l.last, ', ', f.first, ' ', m.middle)
from First as f, Middle as m, Last as l
where f.id = @i and m.id = @i and l.id = @i) full
from Full) u2
on u1.id = u2.id
set u1.full = u2.full;
select * from Full
编辑:我试图避免完全重复。
解决方案
所以你需要 3 个随机数来改善你的混音
Update Full u1
join (select id,
@i:=Floor(1+ RAND() * 3),
@j:=Floor(1+ RAND() * 3),
@k:=Floor(1+ RAND() * 3),
(select concat(l.last, ', ', f.first, ' ', m.middle)
from First as f, Middle as m, Last as l
where f.id = @i and m.id = @j and l.id = @k) full
from Full) u2
on u1.id = u2.id
set u1.full = u2.full;
并使用适当的 JOIN 机制
Update Full u1
join (select id,
@i:=Floor(1+ RAND() * 3),
@j:=Floor(1+ RAND() * 3),
@k:=Floor(1+ RAND() * 3),
(select concat(l.last, ', ', f.first, ' ', m.middle)
from First as f
left join Middle m on m.id = @j
left join Last l on l.id = @k
where f.id = @i ) full
from Full) u2
on u1.id = u2.id
set u1.full = u2.full;
推荐阅读
- python - 有没有办法让一个循环有两个范围?
- c# - 在一个国家/地区生成随机纬度/经度多边形?
- hibernate - 休眠缓存不适用于一对一关系的反面
- python - matplotlib:使用 matplotlib 或 seaborn 显示每个日期的所有产品价格的折线图
- reactjs - 如何在数组中添加对象
- angular - ngbTooltip 和 ngb 分页不起作用
- python - `__dict__` 何时重新初始化?
- c++ - 如何使用 libpqxx 获取 postgres sqlerrorcode?
- json - 如何遍历下面给出的json数据我得到错误
- dart - 如何在颤振中重用同一个小部件的内容?