2014-02-05 73 views
0

我想要的是顯示所有菜單項,同時保持結構。包含父菜單的MySQL顯示菜單

這個問題幾乎涵蓋了我需要的所有東西MySQL 2 level MENU Query

唯一缺少的是: 我想顯示其子菜單前顯示實際的菜單

比方說,我有這樣的:

parent_id id key_i18n myurl 
----------------------------------- 
0   1 menu1  menu1 
0   2 menu2  menu2 
2   3 menu2-1  menu2_1 
2   4 menu2-2  menu2_2 
0   5 menu3  menu3 

key_i18n是一個佔位符,這是針對語言文件進行解析,以根據當前選擇的語言獲得實際值

我想獲得的是:

menu1, 
menu2, 
menu2-1, 
menu2-2, 
menu3 

目前我得到:

menu1, 
menu2-1, 
menu2-2, 
menu3 

菜單-2缺失,這使得它難以輸出結構化的菜單,因爲我沒有什麼可以附加子菜單。

我當前的SQL語句如下:

SELECT 
    IF (m2.parent_id IS NOT NULL, m1.key_i18n, NULL) AS parent, 
    COALESCE(m2.key_i18n,m1.key_i18n) AS key_i18n, 
    COALESCE(m2.myurl,m1.myurl) AS myurl, 
    COALESCE(m2.sequence,m1.sequence) AS sequence 
FROM menu AS m1 
LEFT JOIN menu AS m2 ON m2.parent_id = m1.id 
WHERE m1.parent_id = 0 
ORDER BY m1.sequence, m2.sequence 

請忽略順序列,這基本上是顯示順序爲他們在以後的時間被追加的情況下,項目。

編輯 我得到這個,它返回正是我想要的結果(給出「sequence'列指定的顯示順序整個菜單):

SELECT DISTINCT r.submenu, r.key_i18n1, r.myurl, r.sequence FROM (
    SELECT 
     IF(m2.id IS NULL, false, m1.key_i18n) AS submenu, 
     COALESCE(m2.key_i18n, m1.key_i18n) AS key_i18n1, 
     COALESCE(m2.myurl, m1.myurl) AS myurl, 
     COALESCE(m2.sequence, m1.sequence) AS sequence 
    FROM menu AS m1 
    LEFT JOIN menu AS m2 ON m2.parent_id = m1.id 
    WHERE m1.parent_id = 0 
    UNION 
    SELECT 
     false AS submenu, 
     m3.key_i18n AS key_i18n1, 
     m3.myurl AS myurl, 
     m3.sequence AS sequence 
    FROM menu AS m3 
    WHERE m3.parent_id = 0 
) AS r 
ORDER BY r.sequence 

這很煩人,我有使用2選擇和聯合,但後一個選擇語句爲我提供'menu2' - 這正是我所需要的。

回答

0

爲二級菜單,技巧是可以做的是設置PARENT_ID這樣的:

parent_id id key_i18n myurl 
----------------------------------- 
1*   1 menu1  menu1 
2*   2 menu2  menu2 
2   3 menu2-1  menu2_1 
2   4 menu2-2  menu2_2 
5*   5 menu3  menu3 

然後就命令你的PARENT_ID查詢,ID ASC

+0

我想,如果我這樣做,我仍然在兩者之間不會收到父母菜單的實際標題。我想要的是顯示menu21,menu2,menu2_1,menu2_2,然後menu3。我不確定你的想法是否可行,但我會看看它,並且如果確實如此,請將其標記爲正確答案。 – Igor