🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

4523閲覧

MySQLのユーザ変数で、分析関数を代用できるか?

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

8グッド

1クリップ

投稿2016/03/16 03:41

http://stackoverflow.com/questions/532878/how-to-perform-grouped-ranking-in-mysql
で紹介されてる分析関数をMySQLのユーザ変数で代用するSelect文は、

本番環境で使用するSelect文で、使っていいものなのでしょうか?

たとえば、リンク先のStackOverFlowの下記のSelect文において、

SQL

1SELECT id_student, id_class, grade, 2 @student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 END AS rn, 3 @class:=id_class AS clset 4FROM 5 (SELECT @student:= -1) s, 6 (SELECT @class:= -1) c, 7 (SELECT * 8 FROM mytable 9 ORDER BY id_class, id_student) t 10

たとえば、
全ての行の@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文は、結果が保証されないのだから
本番環境などでは、全く使い物にならないというのが私の認識なのですが、
みなさんはどうでしょうか?

AketiJyuuzou, T.Yokotani, tamako, garasya👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

MySQLのメーリングリスト(日本)に質問して、
Oracleエースの方から回答いただきました。
http://www.mysql.gr.jp/mysqlml/mysql/msg/16319

投稿2016/03/18 07:44

編集2016/03/23 03:03
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MySQLのマニュアルと
OracleACEのAketiJyuuzouさんとyoku0825さんと
日本オラクルの木村明治さんによると
MySQLのユーザ変数は評価順序が未定義です。
http://qiita.com/AketiJyuuzou/items/cced9b70cc714b382d98

なので、分析関数と同じ結果が出ることが保証されません。

結果が保証されないといえば、
OrderBy句がないと出力順が保証されないのは有名ですね。

投稿2016/04/28 01:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問