作者:Guilhem Bichot 译:徐轶韬
在MySQL 8.0.14中,添加了LATERAL派生表的功能。在线手册https://dev.mysql.com/doc/refman/8.0/en/lateral-derived-tables.html中描述了语法,并提供了如何使用该功能在表中查找最大值的示例。
在本文中,我将利用LATERAL解决另一个问题:假设我们有一堆节点,并希将每个节点与其他节点连接生成一个“随机图”。
我们从一个nodes表开始:
create table nodes(id int);
这个表将填充20个节点,使用递归通用表表达式Common Table Expression(MySQL 8.0.1的 另一个功能):
insert into nodeswith recursive cte(n) as(select 1union allselect n+1 from cte where n<20)select * from cte;
现在,让我们在图上创建随机的边。它们是有方向的(具有“from”和“to”)。
create table edges (from_id int, to_id int);
对于每个原始节点,让我们选择两个随机目标节点,并将它们连接到原始节点。
如果我们使用普通派生表来存储两个目标节点:
insert into edges(from_id, to_id)select origin_nodes.id, target_nodes.idfrom nodes as origin_nodes,(select idfrom nodesorder by rand()limit 2) as target_nodes;
在执行INSERT查询时&