MariaDB 10.3.18 で 2 件のランダムな個別レコードを取得する 3 つの方法

2024-05-23

MariaDB 10.3.18 で 2 件のランダムかつ個別レコードを取得する方法

要件

  • MariaDB 10.3.18 以降がインストールされている
  • サンプルデータを含むテーブル

手順

  1. CTE (Common Table Expression) を使用して、各行にランダムな行番号を割り当てます。
WITH cte AS (
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY LEFT(line_name, 1) ORDER BY RAND()) AS rn
  FROM stat
)
  1. rn 列が 1 の 2 件のレコードを選択します。
SELECT `line_name`, `device_name`, `count`
FROM cte
WHERE rn = 1
ORDER BY RAND()
LIMIT 2;

説明

  • ROW_NUMBER() 関数は、各行にパーティション内での相対行番号を割り当てます。
  • PARTITION BY LEFT(line_name, 1) 句は、line_name 列の最初の文字に基づいてパーティションを作成します。これにより、各 line_name 値のセット内で個別の行番号が生成されます。
  • ORDER BY RAND() 句は、ランダムな順序で行をソートします。
  • WHERE rn = 1 句は、rn 列が 1 のレコードのみを選択します。
  • ORDER BY RAND() 句は、選択された 2 件のレコードをランダムな順序で返します。
  • LIMIT 2 句は、2 件のレコードのみを返します。

次の表は、stat テーブルのサンプルデータを示しています。

line_namedevice_namecount
100135480047
100335480036
200135480047
200235480089
300235480089

上記のクエリを実行すると、次の結果が得られます。

line_namedevice_namecount
100335480036
200235480089

補足

  • このクエリは、MariaDB 10.3.18 以降でのみ使用できます。
  • より多くのランダムレコードを取得するには、LIMIT 句の値を増やします。
  • 特定の列のみを取得するには、SELECT 句で列名を指定します。



    MariaDB 10.3.18 で 2 件のランダムかつ個別レコードを取得するサンプルコード

    WITH cte AS (
      SELECT *,
             ROW_NUMBER() OVER (PARTITION BY LEFT(line_name, 1) ORDER BY RAND()) AS rn
      FROM your_table_name
    )
    SELECT `line_name`, `device_name`, `count`
    FROM cte
    WHERE rn = 1
    ORDER BY RAND()
    LIMIT 2;
    
    • このコードは、your_table_name という名前のテーブルを使用しています。必要に応じてテーブル名を変更してください。
    • その他の説明は、前の回答と同じです。

    stat という名前のテーブルがあり、次の列が含まれている場合:

    • line_name
    • count
    line_namedevice_namecount
    100335480036
    200235480089

      このコードをどのように使用すればよいですか?

      このコードを次の方法で使用できます。

      • MariaDB クライアントで直接実行する
      • PHP、Python、Java などのプログラミング言語を使用してこのコードをプログラムに埋め込む

      このコードの利点は次のとおりです。

      • 2 件のランダムかつ個別レコードを簡単に取得できます。
      • 読みやすく、理解しやすいコードです。
      • 複雑なクエリには適していない場合があります。
      • 特定の条件に基づいてレコードをフィルター処理する WHERE 句を追加します。
      • ORDER BY 句を使用してレコードをソートします。
      • SELECT 句を使用して取得する列を指定します。



      MariaDB 10.3.18 で 2 件のランダムかつ個別レコードを取得するその他の方法

      以下のコードは、サブクエリを使用して 2 件のランダムかつ個別レコード を取得する方法を示しています。

      SELECT *
      FROM your_table_name
      ORDER BY RAND()
      LIMIT 2;
      
          line_namedevice_namecount
          200235480089
          100335480036

            方法 2: ウィンドウ関数

            SELECT *
            FROM your_table_name
            WHERE row_num IN (
              SELECT row_num
              FROM (
                SELECT ROW_NUMBER() OVER (ORDER BY RAND()) AS row_num
                FROM your_table_name
              ) AS subquery
              WHERE row_num <= 2
            )
            ORDER BY row_num;
            
            • WHERE 句は、row_num 列が 1 または 2 のレコードのみを選択します。
            • ORDER BY row_num 句は、選択されたレコードを行番号でソートします。
              line_namedevice_namecount
              200235480089
              100335480036

                どの方法を選択する必要がありますか?

                選択する方法は、ニーズによって異なります。

                • シンプルで使いやすい方法 を探している場合は、方法 1 を使用してください。
                • MariaDB 10.2.7 を使用している場合は、方法 1 を使用する必要があります。

                上記以外にも、2 件のランダムかつ個別レコードを取得する方法はいくつかあります。

                • 一時テーブル を使用する方法

                これらの方法は、より複雑で、上記の方法よりもパフォーマンスが低くなる可能性があります。


                  mysql sql mariadb


                  SQLクエリ結果のレコード数を制限する完全ガイド: TOP、LIMIT、その他の方法

                  TOPとLIMITは、どちらもSQLでクエリ結果のレコード数を制限するために使用されるキーワードです。しかし、いくつかの重要な違いがあります。TOPSQL Serverで使用されるキーワードです。最初の N 個のレコードを取得します。ORDER BY句と組み合わせて、特定の順序で最初のN個のレコードを取得できます。...


                  SQLで複数レコードを条件付きで更新する方法

                  SQLの UPDATE 文を使って、テーブル内の複数の列を更新する方法について解説します。基本構文例customers テーブルの name 列と email 列を更新する例です。この例では、id が 1 のレコードの name 列が "山田 太郎" に、email 列が "taro...


                  HeidiSQLでMariaDBの変数を扱う!初心者でも分かる設定方法とサンプルコード

                  このエラーは、変数の宣言に誤りがあることを示しています。このエラーの原因として、以下の点が考えられます。変数の名前が正しくないデータ型が正しくないセミコロン(;)が抜けている宣言の場所が間違っている以下の点を確認し、修正することで問題を解決することができます。...


                  【初心者向け】MySQL/MariaDBで集計クエリを簡単にするビューとストアドプロシージャ

                  MySQL/MariaDB では、集計クエリを繰り返し実行する必要がある場合、ビューまたはストアドプロシージャを使用して効率化することができます。ビュー表のサブセットを定義する仮想テーブルクエリ結果を保存しない既存の表を参照して集計クエリを定義できる...


                  MariaDBでJSON_CONTAINS関数を使って配列値を検索する

                  IN演算子この例では、列名が値1、値2、... のいずれかに一致するすべての行が選択されます。例:このクエリは、価格が1000円、2000円、3000円の商品をすべて選択します。FIND_IN_SET関数この例では、列名に値が含まれているすべての行が選択されます。...


                  SQL SQL SQL SQL Amazon で見る



                  Mariadbデータベースの達人技:重複値を排除してグループ最大値を効率的に取得

                  SQLで重複値をグループごとに最大値でフィルターするには、いくつかの方法があります。ここでは、2つの一般的な方法をご紹介します。方法1:GROUP BY 句と集計関数を使用するこの方法は、最もシンプルで分かりやすい方法です。例次のテーブル orders があるとします。