MySQL显示菜单包括父菜单

时间:2014-02-05 07:36:10

标签: mysql sql menu

我想要的是显示所有菜单项,同时保持结构。

这个问题几乎涵盖了我需要的所有内容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 ” - 这就是我需要的。

1 个答案:

答案 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

进行查询