2016-05-11 70 views
1

enter image description herePARTITION BY不工作

我想创建子菜单菜单。因此,我需要做的就是将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 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''SELECT menu_cat,menu,manu_href,ROW_NUMBER() OVER(PARTITION BY menu_cat ORDER BY' at line 1

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

错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(PARTITION BY menu_id) AS Cat,menu,menu_href from menu LIMIT 0, 30' at line 1

+0

我认为你的查询是针对T-SQL SQL Server的,而不是针对MYsql的。 –

+0

@ Dr.Stitch,请问如何修改mysql? – 112233

+0

在子查询中不需要'[ROW \ _NUMBER()in MySQL](http://stackoverflow.com/questions/1895110/row-number-in-mysql)' –

回答

2

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参考手册警告说,用户定义的变量的这种行为是不确定