mysql:16320
From: <vbwnvwnpwvwenemcew@xxxxxxxxxx>
Date: Tue, 22 Mar 2016 18:18:51 +0900 (JST)
Subject: [mysql 16320] Re: [mysql 16319] Re: [mysql 16318] MySQLのユーザ変数で、分析関数を代用できるか?
Oracleエースの方から回答いただけて光栄です。 また、MySQLの信頼できるサイトのURLありがとうございます。 ユーザ変数は評価順序が保証されない。 なので、 ユーザ変数が、OrderBy句のソート順、かつ、Select句の左から右 で評価されたときに限って、期待した結果を返すSelect文は、結果が保証されない。 なので 本番環境で使用するSelect文では、全く使い物にならない!!! ということで理解しました。 ありがとうございました。 ----- Original Message ----- > From: yoku ts. <yoku0825@xxxxxxxxxx> > To: ml@xxxxxxxxxx > Cc: > Date: 2016/3/20, Sun 16:46 > Subject: [mysql 16319] Re: [mysql 16318] MySQLのユーザ変数で、分析関数を代用できるか? > > yoku0825といいます。 > > おっしゃる通り、ユーザー定義変数の評価順序は定義されていません。 > https://bugs.mysql.com/bug.php?id=79753 > > 至極単純な、たとえばrownumの代用くらいには利用できますが、 > 窓関数のような複雑なことはユーザー定義変数では実現できないと思います。 > (ご認識の通り、結果が保証されないので) > > 他のDBMSにデータをエクスポートして集計した方が良いと思います。 > > > yoku0825, > > > > 2016年3月18日 16:33 <vbwnvwnpwvwenemcew@xxxxxxxxxx>: >> HibinoMeguruと申します。 >> >> TeraTailで質問したのですが回答がないので、 >> https://teratail.com/questions/29899 >> こちらで質問させて下さい。 >> >> > http://stackoverflow.com/questions/532878/how-to-perform-grouped-ranking-in-mysql > >> で紹介されてる分析関数をMySQLのユーザ変数で代用するSelect文は、 >> >> 本番環境で使用するSelect文で、使っていいものなのでしょうか? >> >> たとえば、リンク先のStackOverFlowの下記のSelect文において、 >> >> SELECT id_student, id_class, grade, >> @student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 END > AS rn, >> @class:=id_class AS clset >> FROM >> (SELECT @student:= -1) s, >> (SELECT @class:= -1) c, >> (SELECT * >> FROM mytable >> ORDER BY id_class, id_student) t >> >> たとえば、 >> 全ての行の@class:=id_class という列を評価されてから、 >> 全ての行の@student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 > END AS rn >> を評価するとしたら、結果は期待した通りにならないし >> >> そもそも >> ORDER BY id_class, id_studentの順番で、 >> かつSelect句の左から右にユーザ変数が評価されない限り >> 期待した結果にならないと思います。 >> >> そして、 >> MySQLのマニュアルにも、ユーザ変数の評価順序は、定義されていないと記載されています。 >> > http://download.nust.na/pub6/mysql/doc/refman/5.1-olh/ja/user-variables.html >> >ユーザー変数の評価順序は定義されておらず、 >>> 与えられたクエリー内の要素に基づいて変更されることがあります。 >>> SELECT @a, @a := @a+1 ...では、MySQL は@a を先に評価し次に割り当てが実行されるように見えますが、 >>> クエリーの変更(たとえば GROUP BY、HAVING または ORDER BY 節による変更) >>> は評価順序を変更する可能性があります。 >>> 基本的な規則は、ステートメントの一部でユーザー変数値を割り当てないことおよび >>> 同一ステートメント内の他部分で同じ変数を使用しないことです。 >>> 期待通りの結果を得られるかもしれませんが、これは確約されていません。 >> >> 上記の理由から >> select文でユーザ変数を複数回使って、 >> 分析関数を代用するSelect文は、結果が保証されないのだから >> 本番環境などでは、全く使い物にならないというのが私の認識なのですが、 >> みなさんはどうでしょうか? >> >> >
16318 2016-03-18 16:33 [<vbwnvwnpwvwenemcew@] MySQLのユーザ変数で、分析関数を代用できるか? 16319 2016-03-20 16:46 ┗["yoku ts." <yoku0825] Re: [mysql 16318] MySQLのユーザ変数で、分析関数を代用できるか? -> 16320 2016-03-22 18:18 ┗[<vbwnvwnpwvwenemcew@] Re: [mysql 16319] Re: [mysql 16318] MySQLのユーザ変数で、分析関数を代用できるか?