【问题标题】:How to get data from MySQL hierarchical category tree using Adjacency List Model?如何使用邻接列表模型从 MySQL 分层类别树中获取数据?
【发布时间】:2020-08-27 16:29:58
【问题描述】:

我正在使用 InnoDB 引擎为购物应用程序构建一个 MySQL 关系数据库作为练习(我是菜鸟,对于初学者的问题,提前抱歉)。

对于产品类别,我决定将邻接列表模型用于分层数据树。有两个值得关注的表格:

  • 类别
  1. category_id PK
  2. 姓名
  3. parent_id
  • 产品
  1. id PK
  2. 姓名
  3. 描述
  4. 价格
  5. 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';

但我不知道如何将它与产品表连接起来。

我使用引用 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))

我想我应该使用 JOIN 从两个表中进行选择,但显然我没有得到正确的结果。

我想做的是通过category_id获取产品,同时也检索父类。

此外,当用户点击根目录或任何级别的子类别时,我也想从子节点获取所有产品。

【问题讨论】:

标签: mysql adjacency-list-model


【解决方案1】:

从给定类别(带有子类别)中获取所有产品的解决方案是

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

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多