Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL 8递归CTE生成行数_Mysql_Common Table Expression_Recursive Query_Mysql 8.0 - Fatal编程技术网

MySQL 8递归CTE生成行数

MySQL 8递归CTE生成行数,mysql,common-table-expression,recursive-query,mysql-8.0,Mysql,Common Table Expression,Recursive Query,Mysql 8.0,我想使用MySQL CTE生成n个随机行。到目前为止,我已经: WITH RECURSIVE cte AS ( SELECT LEFT(MD5(RAND()),8) AS `three` UNION ALL SELECT LEFT(MD5(RAND()),8) AS `three` WHERE `rn` < 10 ) SELECT * FROM cte ; 获取行号,但如何使用它?有没有其他解决办法 我使用的是MySQL 8。您可以在CTE中添加一个控制列

我想使用MySQL CTE生成n个随机行。到目前为止,我已经:

WITH RECURSIVE cte AS
(
    SELECT LEFT(MD5(RAND()),8) AS `three`
    UNION ALL
    SELECT LEFT(MD5(RAND()),8) AS `three`
    WHERE `rn` < 10
)
SELECT * FROM cte
;
获取行号,但如何使用它?有没有其他解决办法


我使用的是MySQL 8。

您可以在CTE中添加一个控制列,从一开始计算。然后,您可以将递归步骤限制为当该列中的值超过10或n时结束。在外部选择中,然后只选择具有随机值的列,而不是控制列

WITH RECURSIVE cte
AS
(
SELECT left(md5(rand()), 8) three,
       1 i
UNION ALL
SELECT left(md5(rand()), 8) three,
       i + 1 i
       FROM cte
       WHERE i + 1 <= 10
)
SELECT three
       FROM cte;

我返回深度,而不是列。列数可以是100万,但如果它们是深度5,则上述查询将不起作用。@Thanasis:CTE中只有两列,结果中只有一列,它们不能是100万。对不起,兄弟,我的错误。我是说吵架。不是列。我们的实际例子测量的是水平深度,而不是行数。使用递归有一个原因。测量分录的子分录。如果计算中只有1级深度,那么代码可能会工作。我将尝试编写一个具有多个with的查询,这些with测量每列下的最大列数。我给了你一个“喜欢”,因为你真的监视你的帖子,甚至在最初的帖子发布一年后!。我还想提到的是,在MySQL 8.0.18中,您可以在第二个递归cte参数中使用限制X!只是为了分享我的2cents@Thanasis:当联合查询结果为空集时,递归停止。在这种情况下,当i+1超过10时会发生这种情况。选择到并集的第一个操作数是FROM和WHERE less,因此只生成一行。@Thanasis:第二个操作数也只生成一行。声明递归部分的每次迭代仅对上一次迭代生成的行进行操作。在第一个递归步骤中,前一个集合有一行来自from和WHERE-less选择。这一步产生一行,以此类推。因此,当我从值1开始时,生成的行数是10。
SELECT ROW_NUMBER() OVER () AS `rn`
WITH RECURSIVE cte
AS
(
SELECT left(md5(rand()), 8) three,
       1 i
UNION ALL
SELECT left(md5(rand()), 8) three,
       i + 1 i
       FROM cte
       WHERE i + 1 <= 10
)
SELECT three
       FROM cte;