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