2012-10-22 74 views
1

我正在構建一個多層菜單。因此,例如,每個主菜單項可能有5-10個子菜單項,每個菜單項可能有5-10個第三級項目。菜單項不管來自哪一層,都保存在一張表中。我(目前)使用拉出來的數據查詢看起來是這樣的:需要如何組織SQL結果的建議

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

完美的使用情況下的NOSQL後端,是不是? – smk

+0

@SajitKunnumkal大概如此。我使用EBeans處理大部分其他事情 - 我只是不認爲EBean會在同一張表上支持這些奇怪的嵌套連接。有一個好的後端庫可以使用的建議嗎? –

+0

我會做一個遞歸存儲過程並返回一個xml或json。取決於RDBMS可能很容易或很痛苦: -/ – DavidEG

回答

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 

在你的數據庫。從本質上講,名稱循環回來,您的代碼可以設置它,以便它沿着鏈向上走,直到父列爲空或引用該行的ID。

所以這個菜單最終會看起來像:

Industry 
    Food 
    Burgers 
Application 
    Software 
Product 
+0

這就是我現在所擁有的 –

+0

哦,那麼你不需要這些連接吧?在您的代碼中,您可以沿着鏈條創建菜單。因爲父母告訴你這一點,所以你不需要使用它的空值。 –

+0

空值不是用於它的哪一層,它們是左連接的結果,並且表示菜單沒有任何子菜單的情況 –