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

mysql:16319

From: "yoku ts." <"yoku ts." <yoku0825@xxxxxxxxxx>>
Date: Sun, 20 Mar 2016 16:46:30 +0900
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のユーザ変数で、分析関数を代用できるか?