SQL select 指定类别的所有产品和所有 sub-category

SQL select all products from specified category and all sub-category

项table

id    category_id    item_title
1     2              Seagate SSHD
2     3              Seagtate 2.5 inch HDD
3     4              Western Digital 3.5 inch HDD
4     4              Toshiba 3.5 inch HDD
5     5              Generic Used Monitor
6     6              ASUS Monitor

类别table

id    parent_id    category_title
1     0            Hardware
2     1            Hard Disks
3     2            Laptop Hard Disk
4     2            Desktop Hard Disk
5     1            Monitor
6     5            LCD Monitor

视觉:

                         -- Laptop Hard Disk
          -- Hard Disks |
 Harware-|               -- Desktop Hard Disk
          -- Monitors    -- LCD Monitor

查询:

SELECT * FROM items_table p
JOIN categories_table cp ON p.category_id = cp.id
JOIN categories_table cc ON cp.parent_id = cc.id
WHERE cc.id = "1"

输出

id    category_id    item_title
1     2              Seagate SSHD
5     5              Generic Used Monitor

但是, 我也在尝试从所有 sub-category 中获取项目, IE; 请求 1.when parent 类别必须显示 parent、child 和 grand-child 类别中的所有内容 2.when child 请求的类别必须显示 child 及其 child(grand-child)

中的所有内容

期待; 当请求类别 1(硬件)时

id    category_id    item_title
1     2              Seagate SSHD
2     3              Seagtate 2.5 inch HDD
3     4              Western Digital 3.5 inch HDD
4     4              Toshiba 3.5 inch HDD
5     5              Generic Used Monitor
6     6              ASUS Monitor

当请求类别 2(硬盘)时

id    category_id    item_title
1     2              Seagate SSHD
2     3              Seagtate 2.5 inch HDD
3     4              Western Digital 3.5 inch HDD
4     4              Toshiba 3.5 inch HDD

如何修改我的查询以获取类别中的所有项目及其所有子项sub-category?

我必须警告 id-parentId 方法(称为邻接列表)不适用于任意级别的嵌套。但是,如果您知道它只会是 3 层,那就顺其自然吧。否则请查看嵌套集或物化路径等替代方案。

解决方案是从所有 3 个级别的类别中获取所有必需的类别 ID,然后将它们应用于项目 table。

SELECT *
FROM items
WHERE category_id IN (
  SELECT :cat_id AS id
    UNION ALL
  SELECT c2.id FROM categories AS c2 
  WHERE c2.parent_id = :cat_id
    UNION ALL
  SELECT c3.id FROM categories AS c3 
  JOIN categories AS c3p ON c3p.id = c3.parent_id 
  WHERE c3p.parent_id = :cat_id
)

https://www.db-fiddle.com/f/tCjGASjdJ4UP16dHugMzWi/1