解决MySQL层级不确定的问题(mysql不确定层级)

如何解决MySQL层级不确定的问题

在MySQL数据库中,经常会遇到需要层级展示数据的场景,但往往会发现数据的层级有时候是不确定的,这时候就需要寻找一种能够灵活处理层级展示的方法。本文将探讨如何解决MySQL层级不确定的问题,并给出相关代码实现。

一、问题描述

以商品分类为例,数据库中会存在多个层级的分类数据,但有时候一级分类下面的二级分类可能没有数据,反而三级分类下有数据,这时展示分类数据的方式就变得十分棘手。

例如商品分类数据如下:

| id | name | parent_id |

|—-|———|———–|

| 1 | 电子产品 | null |

| 2 | 手机 | 1 |

| 3 | 笔记本 | 1 |

| 4 | 小米 | 2 |

| 5 | 华为 | 2 |

| 6 | 联想 | 3 |

| 7 | 戴尔 | 3 |

| 8 | 游戏本 | 3 |

| 9 | 游戏机 | null |

| 10 | PS4 | 9 |

| 11 | Switch | 9 |

以上的数据中,商品分类是一个多层级的结构,但是在第一级下的手机分类中,并没有任何子分类,反倒是在第三级的笔记本电脑分类下出现了子分类,这时候就需要通过一些方法来解决层级不确定问题。

二、解决方案

解决层级不确定问题的方法,主要有两种:递归和连接查询。下面将分别介绍这两种方法的原理和实现方式。

1. 递归方式

递归方式是解决层级不确定问题最普遍也最常用的方法。该方法的原理是:从顶层分类开始,逐级向下查询所有的子分类,然后再针对每一个子分类进行同样的操作,直到查完所有的层级。

递归方法的代码如下:

WITH RECURSIVE cte AS (
SELECT id, name, parent_id, 1 as depth
FROM category
WHERE parent_id IS NULL

UNION ALL

SELECT category.id, category.name, category.parent_id, cte.depth + 1
FROM category
JOIN cte ON category.parent_id = cte.id
)
SELECT *
FROM cte
ORDER BY depth, id;

该代码中使用了CTE(通用表表达式)和WITH RECURSIVE语句来实现递归查询,代码的执行结果如下所示:

| id | name | parent_id | depth |

|—-|———|———–|——-|

| 1 | 电子产品 | null | 1 |

| 9 | 游戏机 | null | 1 |

| 2 | 手机 | 1 | 2 |

| 3 | 笔记本 | 1 | 2 |

| 10 | PS4 | 9 | 2 |

| 11 | Switch | 9 | 2 |

| 4 | 小米 | 2 | 3 |

| 5 | 华为 | 2 | 3 |

| 6 | 联想 | 3 | 3 |

| 7 | 戴尔 | 3 | 3 |

| 8 | 游戏本 | 3 | 3 |

从结果可以看出,该递归方法能够很好地解决MySQL层级不确定的问题,且代码简单易懂。

2. 连接查询方式

连接查询方式也可以解决MySQL层级不确定问题,该方法的原理是将同一张表的不同行通过连接查询的方式连接起来,达到逐层查找的效果。

连接查询方法的代码如下:

SELECT 
c1.id as id1, c1.name as name1, c2.id as id2, c2.name as name2, c3.id as id3, c3.name as name3
FROM category c1
LEFT JOIN category c2 ON c2.parent_id = c1.id
LEFT JOIN category c3 ON c3.parent_id = c2.id
WHERE c1.parent_id IS NULL;

该代码中使用了左连接查询的方式来逐层查找,具体执行结果如下:

| id1 | name1 | id2 | name2 | id3 | name3 |

|—–|———-|—–|———|—–|———-|

| 1 | 电子产品 | 2 | 手机 | 4 | 小米 |

| 1 | 电子产品 | 2 | 手机 | 5 | 华为 |

| 1 | 电子产品 | 3 | 笔记本 | 6 | 联想 |

| 1 | 电子产品 | 3 | 笔记本 | 7 | 戴尔 |

| 1 | 电子产品 | 3 | 笔记本 | 8 | 游戏本 |

| 9 | 游戏机 | 10 | PS4 | null| null |

| 9 | 游戏机 | 11 | Switch | null| null |

从结果可以看出,该方法同样能够解决层级不确定的问题,但是代码相对递归方式略显繁琐。

三、总结

针对MySQL层级不确定问题的解决方法,递归和连接查询是比较常用的两种方法,上面的代码实现也说明了它们各自的优缺点。在实际使用中,可以根据具体场景选取相应的解决方法,达到更好的效果。


数据运维技术 » 解决MySQL层级不确定的问题(mysql不确定层级)