我想要的是显示所有菜单项,同时保持结构。
这个问题几乎涵盖了我需要的所有内容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'-column指定整个菜单中的显示顺序):
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个选择和联合,但后面的select语句为我提供了“ menu2 ” - 这就是我需要的。
答案 0 :(得分: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
进行查询