开发者社区 问答 正文

SQL请求获取有序菜单

现在,我建立菜单执行许多请求。我希望能够在单个sql请求中检索相同的内容

MenuItem (Id,parent_id,level,weight) parent_id是对另一个MenuItem的引用

如果我有这些记录

1,null,1,50

2,null,1,20

3,1,2,100

4,1,2,0

我希望结果是

2

4

3

1个

weigtht属性用于在其自身级别内对菜单项进行排序。

这意味着id 2在id 1之前出现,因为权重20 <权重50,但是id 2仍然在id 4之前出现,因为级别1 <level 2

我什至不确定这是可能的。

展开
收起
被纵养的懒猫 2019-10-09 16:48:54 379 分享 版权
阿里云 AI 助理回答

在SQL中,你可以使用递归公用表表达式(Recursive Common Table Expressions, CTE)来处理具有层级关系的数据。对于你的需求,可以尝试以下SQL查询语句(这里假设你使用的是支持递归CTE的数据库系统,如PostgreSQL、MySQL 8.0+或其他支持此特性的系统):

WITH RECURSIVE MenuTree AS (
    -- 基础查询:选取所有没有父级的菜单项作为起始点
    SELECT Id, parent_id, level, weight, CAST(Id AS VARCHAR(255)) AS sort_path
    FROM MenuItem
    WHERE parent_id IS NULL

    UNION ALL

    -- 递归查询:连接子菜单到它们的父菜单,并生成排序路径
    SELECT m.Id, m.parent_id, m.level, m.weight, CONCAT(p.sort_path, '.', m.Id) AS sort_path
    FROM MenuItem m
    JOIN MenuTree p ON m.parent_id = p.Id
)
-- 最终查询:根据排序路径和权重对所有菜单项进行排序
SELECT Id
FROM MenuTree
ORDER BY sort_path, weight DESC;

这个查询首先通过递归CTE MenuTree 构建了一个包含所有菜单项及其排序路径的临时结果集,其中排序路径是根据菜单项的ID与其父级ID的关系生成的字符串,确保了同级菜单按权重降序排列,同时保持父子关系的正确性。最后,根据生成的排序路径和权重对所有菜单项进行排序,从而满足你的需求。

请注意,实际应用时可能需要根据你使用的具体数据库系统调整SQL语法。此外,如果菜单结构非常深或者数据量极大,使用递归查询可能会有性能上的考量,这时可能需要考虑其他优化策略或数据结构设计。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
SQL
问答标签:
问答地址: