PARTITION BY无法工作

4

enter image description here

我想创建带有子菜单的菜单。因此,我需要显示menu_cat作为主菜单(不重复),而menu则是相关menu_cat的子菜单。
像DISTINCT和GROUP BY这样的子句似乎适用于整个行。作为我的搜索结果,我找到了这个链接:DISTINCT仅适用于一列 这正是我想做的。然而,我遇到了错误。以下是我的查询和Phpmyadmin错误。请帮我修复这个错误。
$query = "Select * FROM ('SELECT menu_cat,menu,manu_href,ROW_NUMBER() OVER(PARTITION BY menu_cat ORDER BY menu_id DESC) rn FROM menu')a WHERE rn = 1";

错误:

#1064 - 您的SQL语法有误; 请检查与您的MySQL服务器版本相对应的手册,以了解正确的语法使用方式,在第1行附近出现''SELECT menu_cat,menu,manu_href,ROW_NUMBER() OVER(PARTITION BY menu_cat ORDER BY'。

$query2 = "select menu_cat OVER (PARTITION BY menu_id) AS Cat,menu,menu_href from menu"

错误:

#1064 - 您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以了解正确的语法使用方式,位于第1行附近的'(PARTITION BY menu_id) AS Cat,menu,menu_href from menu LIMIT 0, 30'


我认为你的查询是针对T-SQL SQL Server而不是MYsql。 - Dr. Stitch
@Dr.Stitch,请问如何修改以适应MySQL? - 112233
1
子查询中不需要使用单引号。FROM ('SELECT.. - Sougata Bose
1个回答

9

编辑

注意:MySQL 8.0引入了分析窗口函数的支持,这在早期版本的MySQL中是不支持的。

原始回答

MySQL不支持像ROW_NUMBER() OVERRANK()等“分析函数”。

那些函数在SQL Server、Oracle和其他数据库中可用。

但MySQL不支持。

此外,单引号用于括起字符串字面值。因此,下面的代码:

SELECT * FROM ('SELECT ... ')  

无效,因为字符串字面量在此上下文中无效...无论字符串的内容看起来多像SELECT语句。


在MySQL中,我们有时可以使用用户定义的变量来模拟该类型的功能。

  SELECT v.menu_cat
       , v.menu
       , v.manu_href  
    FROM ( SELECT @rn := IF(m.menu_cat = @prev_menu_cat,@rn+1,1) AS rn
                , @prev_menu_cat := m.menu_cat                   AS menu_cat
                , m.menu
                , m.manu_href
             FROM (SELECT @prev_menu_cat := NULL, @rn := 0) i
            CROSS
             JOIN menu m
            ORDER
               BY m.menu_cat
                , m.menu_id DESC
         ) v
   WHERE v.rn = 1

MySQL参考手册警告说,用户定义变量的这种行为是未定义的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接