gpt4 book ai didi

MySQL显示菜单包括父菜单

转载 作者:行者123 更新时间:2023-11-30 00:43:35 25 4
gpt4 key购买 nike

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

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

最佳答案

对于二级菜单,可以做的技巧是设置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排序您的查询即可

关于MySQL显示菜单包括父菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21571243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com