如何使用邻接表模型从 MySQL 层次类别树中获取数据?
How to get data from MySQL hierarchical category tree using Adjacency List Model?
我正在使用 InnoDB 引擎为购物应用程序构建一个 MySQL 关系数据库作为练习(我是菜鸟,对于初学者问题提前抱歉)。
对于产品类别,我决定对分层数据树使用邻接表模型。有两个table值得关注:
- 类别
- category_idPK
- 姓名
- parent_id
- 产品
- id PK
- 姓名
- 描述
- 价格
- category_id FK
我从 Mike Hillyer 中找到了一个检索完整树的查询:
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent = t1.category_id
LEFT JOIN categories AS t3 ON t3.parent = t2.category_id
LEFT JOIN categories AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';
但我不知道如何将它与产品 table 联系起来。
我使用引用 this question 来获取特定类别(第 19 个元素)的子项的查询:
SELECT category_id,
name,
parent_id
FROM (select * from categories
order by parent_id, category_id) products_sorted,
(select @pv := '19') initialisation
WHERE find_in_set(parent_id, @pv)
AND length(@pv := concat(@pv, ',', category_id))
我想我应该从两个 table 中使用 JOIN 到 select,但显然我没有得到正确的结果。
我想做的,是通过category_id获取产品,同时也检索父类别。
此外,当用户单击根目录或任何级别的子类别时,我也想从子节点获取所有产品。
从给定类别(带子类别)中获取所有产品的解决方案是
SELECT *
FROM products
WHERE category_id IN
(
SELECT category_id
FROM `categories`
WHERE FIND_IN_SET(`category_id`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`category_id` SEPARATOR ',')
FROM `categories`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `categories`
JOIN (SELECT @Ids := 1) temp1
) temp2
))
)
上面的查询选择了 ID 为 1 的类别(和子类别)中的所有产品
这里是Fiddle link
我正在使用 InnoDB 引擎为购物应用程序构建一个 MySQL 关系数据库作为练习(我是菜鸟,对于初学者问题提前抱歉)。
对于产品类别,我决定对分层数据树使用邻接表模型。有两个table值得关注:
- 类别
- category_idPK
- 姓名
- parent_id
- 产品
- id PK
- 姓名
- 描述
- 价格
- category_id FK
我从 Mike Hillyer 中找到了一个检索完整树的查询:
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent = t1.category_id
LEFT JOIN categories AS t3 ON t3.parent = t2.category_id
LEFT JOIN categories AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';
但我不知道如何将它与产品 table 联系起来。
我使用引用 this question 来获取特定类别(第 19 个元素)的子项的查询:
SELECT category_id,
name,
parent_id
FROM (select * from categories
order by parent_id, category_id) products_sorted,
(select @pv := '19') initialisation
WHERE find_in_set(parent_id, @pv)
AND length(@pv := concat(@pv, ',', category_id))
我想我应该从两个 table 中使用 JOIN 到 select,但显然我没有得到正确的结果。
我想做的,是通过category_id获取产品,同时也检索父类别。
此外,当用户单击根目录或任何级别的子类别时,我也想从子节点获取所有产品。
从给定类别(带子类别)中获取所有产品的解决方案是
SELECT *
FROM products
WHERE category_id IN
(
SELECT category_id
FROM `categories`
WHERE FIND_IN_SET(`category_id`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`category_id` SEPARATOR ',')
FROM `categories`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `categories`
JOIN (SELECT @Ids := 1) temp1
) temp2
))
)
上面的查询选择了 ID 为 1 的类别(和子类别)中的所有产品
这里是Fiddle link