【问题标题】:How to classify categories according their parent id using sql如何使用sql根据其父ID对类别进行分类
【发布时间】:2022-01-12 22:18:45
【问题描述】:

假设我有下表

id category_name parent_id
1 movies 0
2 technology 0
3 sci-fiction 1
4 romantic 1
5 documentries 0
6 space 3
7 heros 3
8 saturn 6
9 mars 6
10 black holes 6

我想要的是以每个父母都跟着他的孩子这样的方式订购这些物品:

id category_name parent_id
1 movies 0
3 sci-fiction 1
6 space 3
8 saturn 6
9 mars 6
7 heros 3
4 romantic 1
2 technology 0
5 documentries 0
10 black holes 6

如何编写查询来执行这样的操作?

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 我的问题是我的祖先数量不定,即电影>>科幻>>太空>>土星>>另一个类别>>虚拟类别等...
  • 递归 CTE??
  • 没有这种方法在 order by statement 旁边使用 case,但是如果我只有子类别,那么这个方法有效,然后子子类别将不会正确排序

标签: sql mariadb hierarchical-data mariasql mariadb-10.1


【解决方案1】:

Recursive CTE expressions 在 MariaDB 10.2 中受支持。您标记了您的问题,所以我认为如果您想继续使用 MariaDB,则必须升级。

如果您可以以不同的方式存储数据,则可以使用在 MySQL 或 MariaDB 支持递归 CTE 表达式之前流行的存储分层数据的替代方法之一。有关这方面的一些建议,请参阅:

【讨论】:

  • 有没有不使用递归 CTE 的解决方案?我现在无法升级我的 MariaDB 版本
  • 必须以不同的方式存储数据。请参阅我提供的链接。
  • 顺便说一句,我使用 phpmyadmin 其中提到的 mariaDB 版本,这用于本地开发,我想知道因为我安装了 wordpress(用于另一个项目)并使用相同的 phpmyadmin 来管理 wordpress 数据库,我发现 wordpress 可以像我提到的那样对类别进行分类,但在 phpmyadmin 中使用相同版本的 mariaDB。那么 wordpress 如何在不使用递归 CTE 的情况下做到这一点?
  • 你为什么不查看代码并找出答案。听起来它在您的计算机上,而不是我的。
  • 好的,感谢您的时间和耐心
【解决方案2】:

我认为递归 CTE 是您最好的选择,正如 @Dale K 所建议的那样。我认为我在这里汇总的递归 CTE 非常接近您想要的。让我知道你的想法:

WITH RECURSIVE cte_stuff AS (
    (SELECT      
        id, 
        category_name,
        parent_id,
       CAST(category_name AS VARCHAR(5000)) as hierarchy
    FROM       
        stuff st
    WHERE parent_id = 0)
    UNION ALL
    SELECT 
        s.id,
        s.category_name,
        s.parent_id,
        CAST(CONCAT(ss.hierarchy,'->',s.category_name) AS VARCHAR(5000)) AS Hierarchy
    FROM 
        stuff s
        JOIN cte_stuff ss 
            ON ss.id = s.parent_id
)
SELECT * FROM cte_stuff ORDER by hierarchy

结果如下所示:

你可以在这里看到我的 dbfiddle:https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=b5c0b669f0bc611bda576502967170ee

【讨论】:

  • 有没有不使用递归 CTE 的解决方案?我现在无法升级我的 MariaDB 版本 –
  • 查看@Bill Karwin 的评论。我应该仔细查看您使用的 MariaDB 版本,但是,我不知道如何在不升级或更改数据结构的情况下获得您正在寻找的解决方案。
猜你喜欢
  • 2016-06-12
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多