分区不工作

112*_*233 3 php mysql

在此处输入图片说明

我想创建带有子菜单的菜单。因此,我需要做的就是显示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";
Run Code Online (Sandbox Code Playgroud)

错误:

#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"
Run Code Online (Sandbox Code Playgroud)

错误:

#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的“(PARTITION BY menu_id) AS Cat,menu,menu_href from menu LIMIT 0, 30”附近使用的正确语法

spe*_*593 5

编辑

注意:MySQL 8.0 引入了对早期 MySQL 版本中没有的分析窗口函数的支持。

原答案

MySQL不支持“分析功能”之类ROW_NUMBER() OVERRANK()等等。

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

但不是 MySQL。

此外,单引号将字符串文字括起来。所以这:

SELECT * FROM ('SELECT ... ')  
Run Code Online (Sandbox Code Playgroud)

无效,因为字符串文字在该上下文中无效……无论字符串的内容看起来多么像 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
Run Code Online (Sandbox Code Playgroud)

MySQL 参考手册警告用户定义变量的这种行为是undefined