質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.35%

  • MySQL

    7413questions

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

ランダムな条件のSELECTの結果

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,625

XCUBE

score 93

なぜそうなるのかわかなくなったので教えてください。
MariaDBなんですが、phpMyAdminを使ってSELECTした結果がなぜそうなるのかわからないんです。

pointテーブルに2件のデータが入っています。
このテーブルのプライマリキーidカラムはtinyint(4)で2件それぞれ0と1が入っています。

次のSQLを実行します。

SELECT * FROM point WHERE id = (FLOOR(RAND() * 100) % 2)

式(FLOOR(RAND() * 100) % 2)が0か1になるようにしたつもりなのですが
何回か行った結果は
   id=0が取得される場合
   id=1が取得される場合
   2件とも取得できる場合
   どちらも取得できない場合
となりました。
この4パターンが出る確率はほぼ同じです。

なぜ2件取得されるのか?、どちらも取得できないのか?
そうなる理由が解りません。どうかお教えください。

環境
OS archlinux 4.2.5-1
DB mysqld 10.1.9-MariaDB

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

MySQLのリファレンスマニュアル(この辺にMySQL/MariaDBで差異はないでしょう)によると:

WHERE 句内の RAND() は、WHERE が実行されるたびに再評価されます。

とありますね。XCUBEさんの現在の想定だと

SELECT * FROM point WHERE 0 = (FLOOR(RAND() * 100) % 2)


の出力結果は、「0行」か「2行両方」のいずれかになるのではないでしょうか。
(が、実際にはそうではない、すなわち再評価されている)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/21 09:42

    そういうことだったんですね。
    私が一番多用するSQL ServerではRAND()の値は全ての行に対して一定となるので
    このようなことは全く想定していませんでした。

    他の方も同様に回答いただきありがとうございました。

    キャンセル

  • 2015/12/21 11:03

    マニュアルに敢えてこのように書かれているからには他のRDBMSだと違うのだろうな、と考え、PostgreSQL9.3, Oracle11g, sqlite3でも試してみたのですが、MySQLと同様の挙動になったので、あれ…?と思っていたところでしたw。なるほど!SQL Serverがそれだったのですね。普段あまりWindowsを使わないのですっかり失念しておりました…

    キャンセル

  • 2015/12/21 13:14

    そういえば数年前にMySQLである検定の模擬試験のWebサービスの開発をしたとき
    問題集が登録されたテーブルから無作為に30問出題するのに
    「ORDER BY RAND() LIMIT 30」
    で簡単に実装できたことを今思い出しました。私もすっかり失念しておりましたw

    キャンセル

+3

1行毎にFLOOR(RAND() * 100) % 2が実行されているからです。
次のようなSQL文を発行するとよくわかります。

SELECT id, RAND() FROM point;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/18 21:53

    言われ通りですね(^ ^)
    乱数の評価の問題です
    抽選ゲームとかの仕組みが理解出来れば、わかると思いますよ

    キャンセル

0

これは RAND() がレコードごとに評価されるからだからかと思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

このSQLですが、設計中の画面のデモを行うため、表示するデータのパターンをDBに登録し、一定間隔でランダムに変化させたいために考えました。
想定ではランダムに一行だけを取得したかったのですが、ご回答いただいた通り、これではだめなので、ランダムな仮想テーブルにすることで無事解決しましたのでご報告させていただきます。

SELECT a.* FROM point a INNER JOIN (SELECT (FLOOR(RAND() * 100) % 2) id) t ON a.id = t.id

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • MySQL

    7413questions

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