【问题标题】:MySQL display menu including parent menuMySQL显示菜单包括父菜单
【发布时间】:2014-03-01 12:42:27
【问题描述】:

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

这个问题几乎涵盖了我需要的一切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

缺少menu-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

请忽略序列列,它基本上是项目的显示顺序,以防它们稍后被附加。

编辑 我得到了这个,它返回了我想要的结果(给定“序列”列指定整个菜单的显示顺序):

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' - 这正是我所需要的。

【问题讨论】:

    标签: mysql sql menu


    【解决方案1】:

    对于两级菜单,可以这样设置 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 排序您的查询

    【讨论】:

    • 我想如果我这样做,我仍然不会收到两者之间的父菜单的实际标题。我想要的是显示 menu21、menu2、menu2_1、menu2_2 和 menu3。我不确定您的想法是否可行,但我会查看它并标记为正确答案。
    猜你喜欢
    • 2017-02-08
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多