【问题标题】:How to get all items by top parent category?如何按顶级父类别获取所有项目?
【发布时间】:2018-12-30 21:34:56
【问题描述】:

我有 2 个表:shop_productsshop_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 JOINs LEFT JOIN.. 在 SQL 中存储分层数据的其他一些更好的选项是“嵌套集模型”(“Modified Preorder”树”)或“闭包表”
  • @nick,我已经更新了帖子
  • Required read when working with categories in mysql。使用它会使您尝试的工作变得容易得多。 (当然,假设您自己开发类别)

标签: mysql


【解决方案1】:

使用下面的查询:

SELECT s.* FROM shop_products as s WHERE EXISTS (
  SELECT id FROM shop_category as sc WHERE sc.id = s.category_id AND EXISTS(
  SELECT id FROM shop_category as sc1 WHERE sc.id = sc1.id AND sc1.active = 1

  )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多