2016-05-11 63 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參考手冊警告說,用戶定義的變量的這種行爲是不確定