我想创建带有子菜单的菜单。因此,我需要做的就是显示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”附近使用的正确语法
编辑
注意:MySQL 8.0 引入了对早期 MySQL 版本中没有的分析窗口函数的支持。
原答案
MySQL不支持“分析功能”之类ROW_NUMBER() OVER,RANK()等等。
这些函数在 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。