【问题标题】:list all products of main category and subcategories列出主要类别和子类别的所有产品
【发布时间】:2013-05-24 15:01:39
【问题描述】:

我有 2 张桌子:

类别

id - name - parent
1 - Category 1 - 0
2 - Category 2 - 0
3 - Category 3 - 0
4 - Category 4 - 0
5 - Subcategory 11 - 1
6 - Subcategory 111 - 5
7 - Subcategory 112 - 5
...

产品

id - name - category - description
1 - Name - 5 - Description

在类别表中,我有 3 个级别

  • 类别 1
    • 子类别 11
    • 子类别 111
    • 子类别 112
    • 子类别 113
  • 子类别 12
    • 子类别 121
    • 子类别 122
    • 子类别 123
    • 子类别 13
  • 2 类
  • 第 3 类

我从以下子类别中选择产品:

mysql_query("SELECT *, products.name AS p_name, categories.name AS c_name
FROM products
INNER JOIN categories ON categories.id = products.category
WHERE categories.id = '". $_GET['items'] ."'
GROUP BY products.id DESC");

产品属于第三级类别(子类别 111、子类别 112、子类别 113、子类别 121...)

当我访问父类别或主类别(类别 1、类别 2、子类别 11、子类别 12...)时,如何查看此类别中的所有产品?

谢谢!

【问题讨论】:

  • 错了,你的问题是什么?你的代码有什么问题?
  • 如何管理类别层次结构:类别表中的自联接、边表?
  • 队长,对不起!当我访问主类别时,我需要查看子类别中的产品...
  • 你能在这里展示你尝试过的代码吗..
  • 我用我使用的代码编辑了帖子

标签: php mysql categories


【解决方案1】:

如果层次结构的数量已知或假设,您可以执行以下操作:

Select Root.name
    , Level1.name As Level1Category
    , Level2.name As Level2Category
From Category As Root
    Left Join Category As Level1
        On Level1.parent = Root.id
    Left Join Category As Level2
        On Level2.parent = Level1.id
Where Root.parent = 0
Order By Root.name, Level1.name, Level2.name

要查看产品,您只需将产品加入到任何层次结构级别:

Select Root.name
    , Level1.name As Level1Category
    , Level2.name As Level2Category
    , P.name As ProductName
From Category As Root
    Left Join Category As Level1
        On Level1.parent = Root.id
    Left Join Category As Level2
        On Level2.parent = Level1.id
    Join Products As P
        On P.category = Root.id
            Or P.category = Level1.id
            Or P.category = Level2.id
Where Root.parent = 0
Order By Root.name, Level1.name, Level2.name, P.name

【讨论】:

  • 现在它适用于父类别@Thomas,但是当我进入第三个类别时,它会列出所有产品......不仅来自这些类别......SELECT *, root.name, level1.name AS level1category, level2.name AS level2category, p.name AS p_name FROM categories AS root LEFT JOIN categories AS level1 ON level1.parent = root.id LEFT JOIN categories AS level2 ON level2.parent = level1.id JOIN products AS p ON p.category = root.id OR p.category = level1.id OR p.category = level2.id WHERE root.parent = 13 ORDER BY root.name, level1.name, level2.name, p.name
  • WHERE root.parent = 13 更改为 WHERE root.parent = '". $_GET['items'] ."' 现在当我进入第三级时,未列出产品...
  • 我找到了WHERE root.id = '". $_GET['items'] ."',已修复!谢谢@Thomas!
  • 为什么我不能显示类别级别 1 名称?我使用echo $row['level1category'];,它的值是空的......有什么想法吗?
  • @zmeutz - 我不确定您现在使用的是什么过滤,但考虑到我的查询设计,绝不应该出现没有 1 级类别的 2 级类别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多