Php sql生成包含产品的类别菜单

Php sql生成包含产品的类别菜单,php,mysql,sql,Php,Mysql,Sql,我有3个表(mysql) 产品 产品标识, 头衔 类别 类别识别码, 家长id, 头衔 产品类别 产品标识, 类别识别码 类别树的深度未知。 有没有办法通过一次查询知道哪些类别有类别等,哪些类别有产品?是的,请尝试: select c1.*, c2.* from categories c1, categories c2, products_categories pc where c1.category_id = c2.parent_id and pc_category_id = c1.categ

我有3个表(mysql)

产品 产品标识, 头衔

类别 类别识别码, 家长id, 头衔

产品类别 产品标识, 类别识别码

类别树的深度未知。 有没有办法通过一次查询知道哪些类别有类别等,哪些类别有产品?

是的,请尝试:

select c1.*, c2.* from categories c1, categories c2, products_categories pc where c1.category_id = c2.parent_id and pc_category_id = c1.category_id;

c1,c2给了我们树的传递闭包,pc给了我们树的叶子。

我想有更好的方法来实现这一点,但这应该是可行的:

SELECT tb1.* FROM categories AS tb1 JOIN products_categories AS tb2 ON tb1.category_id=tb2.category_id AND tb2.product_id IN (SELECT tb3.product_id FROM products AS tb3 JOIN products_categories AS tb4 ON tb3.product_id=tb4.product_id WHERE tb3.product_id=tb2.product_id)

对于您当前的数据模型,我认为在MySQL中不可能做到这一点。你可以通过查找Joe Celko关于树和层次结构的书或本文中的一些链接来找到层次结构的替代模型:为什么不在所有类别上都做同样的事情呢?如果没有产品,那么你的查询将不会有任何回报,但可以通过JOIN来完成,现在我将检查它,我使用递归获取第一个父类别,然后为每个父类别获取其子类别等来构建菜单。但我怎么知道某个类别没有产品,所以我不显示它?