我想从嵌套的类别列表中创建一个漂亮的url菜单数组。
表格:
- 类别(lft,rgt,id)
- categories_description(cat_id,lang_id,name)
- seo_url(cat_id,prod_id,man_id,url)
表格categories
包含所有类别,类别名称来自表格categories_description
,漂亮的网址来自表格seo_url
。
有没有办法组合所有三个表并在1个查询中获取整个菜单数组?
例如:
- 父级(父级名称)
- parent / subcat(,名称为subcat )
- parent / subcat2(,名称为subcat2 )
- parent2(,名称为parent2 )
- parent2 / subcat32(,名称为subcat32 )
- parent2 / subcat42 / subcat23(,名称为subcat23 )
- parent3(,名称为parent3 )
- parent4(,名称为parent4 )
- parent4 / subcat4(,名称为subcat4 )
答案 0 :(得分:1)
如果它们仅嵌套到设定深度(例如,根据您的示例最多3级),那么您应该能够。你最终会得到一些列为null的列,你必须在代码中提供,而不是sql查询。
很难为您提供您提供的数据的具体示例 但它会是这样的(注意这是未经测试的)
select parent_description.name as parent_name,
parent_url.url as parent_url,
child_description.name as child_name,
child_seo_url.url as child_url,
grandchild_description.name as grandchild_name,
grandchild_seo_url.url as grandchild_url,
from categories as parent
join category_description as parent_description on parent.id=parent_description.cat_id
join seo_url as parent_seo_url on parent.id=parent_seo_url.cat_id
left outer join categories as child on parent.id=child.parent_id
left outer join category_description as child_description on child.id=child_description.cat_id
left outer join seo_url as child_seo_url on child.id=child_seo_url.cat_id
left outer join categories as grandchild on grandchild.id=child.parent_id
left outer join category_description as grandchild_description on grandchild.id=grandchild_description.cat_id
join seo_url as grandchild_seo_url on grandchild.id=grandchild_seo_url.cat_id
哪个应该像
一样parent_name | parent_url | child_name | child_url | grandchild_name | grandchild_url
parent | url | NULL | NULL | NULL | NULL
parent | url | child | url | NULL | NULL
parent | url | child | url | grandchild | url
你应该能够从那个
渲染html答案 1 :(得分:1)
您可以一次性获取所有类别,并在代码中构建层次结构。
select *
from categories c
join categories_description d on d.cat_id = c.id
join seo_url u on d.cat_id = u.id;
我不再熟悉PHP,但使用哈希查找父类别应该可以很好地工作。最后,您必须根据需要对整个列表进行排序。
表现明智,我不会太担心。构建和排序菜单应该比获取数据本身更快(假设代码写得很好),因为我们在这里谈论几毫秒。整个结构肯定是一个很好的缓存候选者 - 但是在你不得不这样做之前不要这样做。
答案 2 :(得分:0)
感谢您的解决方案。我决定使用这个查询,因为它以我在问题中写的方式导出菜单数组。
SELECT node.cat_id, node.lft, node.rgt, GROUP_CONCAT(su.url ORDER BY parent.lft SEPARATOR "/" ) AS path, (COUNT(parent.lft) - 1) AS depth, cd.name AS name
FROM categories AS node
JOIN categories AS parent ON node.lft BETWEEN parent.lft AND parent.rgt
JOIN seo_url AS su ON parent.cat_id = su.cat_id
JOIN categories_description AS cd ON node.cat_id = cd.cat_id
WHERE parent.lft >= 1
GROUP BY node.cat_id
ORDER BY node.lft