28

在我的 MySQL 模式中,我有category(id, parentid, name)

在 MSSQL 中,我有那个 CTE 查询(从下往上为提供的类别 ID 构建类别树:

with CTE (id, pid, name) 
as
(
    select id, parentid as pid,name
    from category
    where id = 197
      union all
        select CTE.pid as id , category.parentid as pid, category.name
        from CTE 
          inner join category 
            on category.id = CTE.pid
 )
 select * from CTE 

如何将该查询“转换”为 MySQL?

4

4 回答 4

34

不幸的是 MySQL 不支持 CTE(通用表表达式)。这是迟来的国际海事组织。通常,您可以只使用子查询,但这个特定的 CTE 是递归的:它在查询中引用自身。递归 CTE 对分层数据非常有用,但同样:MySql 根本不支持它们。您必须实现一个存储过程才能获得相同的结果。

我以前的答案应该提供一个很好的起点:

从 MySQL 中的分层数据生成基于深度的树(无 CTE)

于 2012-01-12T10:40:39.783 回答
4

值得庆幸的是,它不再需要了,因为 MySQL 从8.0.1开始 支持 CTE

于 2017-08-04T16:59:53.597 回答
0

不幸的是 MYSQl 或 XAMPP(MARIADB) mysql 不支持 CTEs(COMMON TABLE EXPRESSIONS),同样你将不得不使用嵌套查询。

欲了解更多信息,请点击以下链接:-

https://mariadb.com/kb/en/library/with/

于 2018-07-11T03:31:02.437 回答
0

请检查您使用的 MySQL 版本SELECT VERSION(); 如果是 8 或更高版本,您可以继续我的评论。在 MySQL 8.0、MariaDB 10.2 和更高版本中,您可以使用递归 CTE:

WITH RECURSIVE CTE (id, pid, name) AS (
    select id, parentid as pid,name
from category
where id = 197
  union all
    select CTE.pid as id , category.parentid as pid, category.name
    from CTE 
      inner join category 
        on category.id = CTE.pid
)
select * from CTE ;

请注意,CTE 受 MySQL 中的 cte_max_recursion_depth(默认 1000,最大 4,294,967,295 (2³²−1))和 MariaDB 中的 max_recursive_iterations(默认 4,294,967,295)的限制。

您可以通过执行来增加限制:

SET cte_max_recursion_depth = 4294967295;

它只会影响您当前的会话并且不会被持久化。

于 2021-02-12T13:06:25.563 回答