MySQL递归获取商品分类以及所有下级分类商品

现在就是我们有一张商品表,还有一张分类表,商品表有一个字段用来记录当前商品分类id的,然后查询时候因为分类是有层级的,如果我们想通过顶层分类获取到它和所有子类的商品时就会需要用到MySQL的递归查询了。

首先是针对 MySQL 8.0 及以上版本,因为已经自带了 WITH RECURSIVE 递归函数,所以查询时简单很多,直接看 SQL

WITH RECURSIVE category_tree AS (
    SELECT id
    FROM category
    WHERE id = 1  -- 起始分类ID
    UNION ALL
    SELECT c.id
    FROM category c
    INNER JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT g.*
FROM goods g
INNER JOIN category_tree ct ON g.category_id = ct.id;

看一下查询结果

在这里插入图片描述

这么写可能有些人看着有些奇怪,我们换个方式就好理解一些

WITH RECURSIVE category_tree AS (
    SELECT id
    FROM category
    WHERE id = 1  -- 起始分类ID
    UNION ALL
    SELECT c.id
    FROM category c
    INNER JOIN category_tree ct ON c.parent_id = ct.id
) SELECT id FROM category_tree

从下面的查询结果可以看到 WITH RECURSIVE 可以通过顶层的分类 id 获取其所有的下级分类 id,拿到这些 id 自然就可以查询到它所有的商品

在这里插入图片描述

这样我们在代码里面就可以这样写

在这里插入图片描述

上面说了 WITH RECURSIVE 是 MySQL 8.0 才有的函数,那么 MySQL 8.0 以下有没有办法查,答案当然是有的

SELECT g.*
FROM goods g
WHERE g.category_id IN
(SELECT 
    T2.id
FROM 
    (SELECT @r AS _id, 
            @r := (SELECT id FROM category WHERE parent_id = _id LIMIT 1) AS id
     FROM 
            (SELECT @r := 1) vars,
            category
     WHERE 
            @r IS NOT NULL) T1 
JOIN 
    category T2 
ON 
    T1._id = T2.parent_id OR T1._id = T2.id
ORDER BY 
    T2.id);

可以看到查询结果是一样的

在这里插入图片描述

关于这种递归我之前就写过一篇博客,大家有兴趣可以去看一下 MySQL通过SQL语句进行递归查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值