[前][次][番号順一覧][スレッド一覧]

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のユーザ変数で、分析関数を代用できるか?