MySQL嵌套集层次结构相当url菜单数组

时间:2011-10-04 08:35:14

标签: php mysql

我想从嵌套的类别列表中创建一个漂亮的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
  •   

3 个答案:

答案 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