1

我正在构建一个多层菜单。因此,例如,每个主菜单项可能有 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 有一个想法。

4

1 回答 1

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 会循环回来,您的代码可以对其进行设置,以便它沿着链向上走,直到父列为空或引用该行的 ID。

所以这个菜单最终看起来像:

Industry
  Food
    Burgers
Application
  Software
Product
于 2012-10-22T20:22:54.167 回答