我正在构建一个多层菜单。因此,例如,每个主菜单项可能有5-10个子菜单项,每个子菜单项可能有5-10个第三级项。菜单项,无论它们来自哪个层,都保存在一个表中。我(当前)用于提取数据的查询如下所示:
SELECT *
FROM menu_items AS m1
LEFT JOIN (SELECT name AS slName, id AS slId, parent_id AS slPid FROM menu_items)
m2 ON m1.id = m2.slPid
LEFT JOIN (SELECT name AS tlName, id AS tlId, parent_id AS tlPid FROM menu_items)
m3 ON m2.slId = m3.tlPid
WHERE parent_id = 0
这个查询的结果在视觉上看起来像我想要的菜单,但现在我想我可能想尝试重组,以便我可以干净地将它粘贴在一个对象中,而不是将其作为DataTable或其他任何东西
以上是上述查询的示例结果:
作为参考,sl表示第二级,tl表示第三级,等等。
{id=1, name=Industry, level=1, parent_id=0, slname=Equipment & Machinery, slid=4, slpid=1, tlname=null, tlid=null, tlpid=null}
{id=1, name=Industry, level=1, parent_id=0, slname=Food, slid=5, slpid=1, tlname=null, tlid=null, tlpid=null}
{id=1, name=Industry, level=1, parent_id=0, slname=Fabricated Metal Products, slid=8, slpid=1, tlname=null, tlid=null, tlpid=null}
{id=1, name=Industry, level=1, parent_id=0, slname=Automotive, slid=9, slpid=1, tlname=null, tlid=null, tlpid=null}
{id=1, name=Industry, level=1, parent_id=0, slname=Chemicals and Allied Products, slid=10, slpid=1, tlname=null, tlid=null, tlpid=null}
{id=2, name=Application, level=1, parent_id=0, slname=App Stuff 1, slid=11, slpid=2, tlname=null, tlid=null, tlpid=null}
{id=2, name=Application, level=1, parent_id=0, slname=App Stuff 2, slid=12, slpid=2, tlname=null, tlid=null, tlpid=null}
{id=2, name=Application, level=1, parent_id=0, slname=App Stuff 3, slid=13, slpid=2, tlname=null, tlid=null, tlpid=null}
{id=2, name=Application, level=1, parent_id=0, slname=App Stuff 4, slid=14, slpid=2, tlname=null, tlid=null, tlpid=null}
{id=3, name=Product, level=1, parent_id=0, slname=Prod Stuff 1, slid=15, slpid=3, tlname=null, tlid=null, tlpid=null}
{id=3, name=Product, level=1, parent_id=0, slname=Prod Stuff 2, slid=16, slpid=3, tlname=null, tlid=null, tlpid=null}
{id=3, name=Product, level=1, parent_id=0, slname=Prod Stuff 3, slid=17, slpid=3, tlname=null, tlid=null, tlpid=null}
所以问题是现在我最终得到了一堆行,这些行的格式不是很好,无法创建一个Menu对象。我只是在寻找有关如何重组的建议。也许更改sql查询,以获得更好的基本数据集,或者可能是如何格式化我当前的SQL。
答案 0 :(得分:1)
您可以执行以下操作:
ID NAME PARENT
1 Industry 1(or null. either self referencing or null = top level)
2 Food 1
3 Burgers 2
4 Application 4
5 Software 4
6 Product 6
在您的数据库中。本质上,Name循环返回,你的代码可以设置它,以便它向上走链,直到父列为null或引用该行的ID。
所以这个菜单看起来像是:
Industry
Food
Burgers
Application
Software
Product