选择类别的所有项目以及其子类别中的所有项目


Select all items for category and all from its subcategories

我正在尝试建立自己的网上商店。
我有两个表 - 产品和类别。结构是这样的:


categories :
id       name       parent_id  

products :
id       title      category_id  

在用户单击主要类别的那一刻,我正在选择要显示的产品,如下所示:

url : www.mypage.com/?category_id=1
sql : 'SELECT * FROM products WHERE category_id = 1'  

问题是我想在用户单击主类别以从其子类别中选择所有产品时做到这一点。例如,类别 Family 是类别 Cars 的子类别,在数据库中看起来像这样

categories :
id       name       parent_id  
1        'Cars'     0
2        'Family'   1  
3        'Sport'    1  
products :
id       title      category_id  
1        'Ferrari'  3 
2        'Honda'    2  

如您所见,我当前的选择不会选择FerrariHonda,因为用户正在查看带有id=1类别......如何修改我的选择,使其显示主类别的子类别中的所有产品?

"SELECT * FROM products WHERE category_id = '$your_category_id'
OR category_id IN (
  SELECT parent_id FROM categories 
    WHERE id = '$your_category_id'
)"

注意:此示例仅适用于两级深度。

例如

Ferrari > Cars

它不超过两个级别。

例如

Ferrari Child Category > Ferrari > Cars
如果你在

类别树中有两个以上的级别,你将需要一个单独的表(有时称为闭包表),该表将引用每个类别及其祖先/降序类别。查看此链接以获取示例:https://stackoverflow.com/questions/tagged/transitive-closure-table<</p>

div class="answers">

如果层次结构只有一级深度,则可以像这样修改查询...

SELECT * FROM Products WHERE Category_id IN (
    SELECT Id 
    FROM Categories 
    WHERE Id = 1 OR parent_id = 1)

希望有帮助