2016-05-11 1 views
1

enter image description here区切り記号が機能しない

サブメニューでメニューを作成したい。したがって、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文のように見えるどのくらい...そのコンテキストで有効ではないではありませんので、

SELECT * FROM ('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のリファレンスマニュアルには、ユーザー定義変数のこの動作は未定義であることを警告しています。

関連する問題