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
)
项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
)