我正在尝试建立自己的网上商店。
我有两个表 - 产品和类别。结构是这样的:
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
如您所见,我当前的选择不会选择Ferrari
或Honda
,因为用户正在查看带有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
如果你在
div class="answers">类别树中有两个以上的级别,你将需要一个单独的表(有时称为闭包表),该表将引用每个类别及其祖先/降序类别。查看此链接以获取示例:https://stackoverflow.com/questions/tagged/transitive-closure-table<</p>
如果层次结构只有一级深度,则可以像这样修改查询...
SELECT * FROM Products WHERE Category_id IN (
SELECT Id
FROM Categories
WHERE Id = 1 OR parent_id = 1)
希望有帮助