PARTITION BY不工作

时间:2016-05-11 04:26:01

标签: php mysql

enter image description here

我想用子菜单创建菜单。因此,我需要做的就是将menu_cat显示为主菜单(不重复),而menu是相关menu_cat的子菜单。

像DISTINCT和GROUP BY这样的子句似乎适用于整行。根据我的搜索结果,我发现了这个链接:DISTINCT for only one Column

这正是我想要做的。但是我收到了错误。下面是我的查询和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服务器版本,以便使用正确的语法   ''SELECT menu_cat,menu,manu_href,ROW_NUMBER()OVER(PARTITION BY)附近   menu_cat ORDER BY'在第1行

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

错误:

  

#1064 - 您的SQL语法出错;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   '(PARTITION BY menu_id)AS Cat,menu,menu_href from菜单LIMIT 0,   第1行30'

1 个答案:

答案 0 :(得分:3)

修改

注意: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参考手册警告用户定义变量的这种行为是 undefined