解决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 name3FROM category c1
LEFT JOIN category c2 ON c2.parent_id = c1.idLEFT 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层级不确定问题的解决方法,递归和连接查询是比较常用的两种方法,上面的代码实现也说明了它们各自的优缺点。在实际使用中,可以根据具体场景选取相应的解决方法,达到更好的效果。