【发布时间】:2018-12-30 21:34:56
【问题描述】:
我有 2 个表:shop_products 和 shop_category。
shop_products: id、name、category_id
shop_category: id、name、parent_id、活动。活动可以是“真”或“假”。
类别嵌套,如 parent>subcat>subsubcat>...
如何获得所有顶级父类别活动为“真”的产品?
我尝试使用 JOIN。但它只需要最接近的类别,而不是树的顶级类别。
SELECT * FROM shop_products
INNER JOIN shop_category as sc1 ON (shop_products.category_id=sc1.id)
INNER JOIN shop_category as sc2 ON (sc1.parent_id=sc2.id)
WHERE sc2.active=1
统一更新: 这里是sqlfiddle
我希望什么都得不到。因为顶级类别 'Cat1' 有活动 false
【问题讨论】:
-
您能否编辑您的问题以包含示例数据和预期输出?具体来说,顶级类别的 parent_id 值是多少?
-
邻接列表模型(parent_id 模型)不是在 SQL 中存储分层数据的最佳方法,因为您需要使用递归公用表表达式 (CTE)(仅限 MySQL 8.0)或其他一些技巧来为每条路径模拟递归 SQL (stackoverflow.com/questions/20215744/…) 或 (stackoverflow.com/questions/3752078/…) 或大量关闭
LEFT JOINsLEFT JOIN.. 在 SQL 中存储分层数据的其他一些更好的选项是“嵌套集模型”(“Modified Preorder”树”)或“闭包表” -
@nick,我已经更新了帖子
-
Required read when working with categories in mysql。使用它会使您尝试的工作变得容易得多。 (当然,假设您自己开发类别)
标签: mysql