我想用子菜单创建菜单。因此,我需要做的就是将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'
答案 0 :(得分:3)
修改强>
注意:MySQL 8.0引入了对早期版本的MySQL中不存在的分析窗口函数的支持。
原始回答
MySQL不支持"分析功能"例如ROW_NUMBER() OVER
,RANK()
等
这些功能在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 。