MariaDB 10.3.18 で 2 件のランダムな個別レコードを取得する 3 つの方法
MariaDB 10.3.18 で 2 件のランダムかつ個別レコードを取得する方法
要件
- MariaDB 10.3.18 以降がインストールされている
- サンプルデータを含むテーブル
手順
- CTE (Common Table Expression) を使用して、各行にランダムな行番号を割り当てます。
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY LEFT(line_name, 1) ORDER BY RAND()) AS rn
FROM stat
)
- 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_name | device_name | count |
---|---|---|
1001 | 3548004 | 7 |
1003 | 3548003 | 6 |
2001 | 3548004 | 7 |
2002 | 3548008 | 9 |
3002 | 3548008 | 9 |
上記のクエリを実行すると、次の結果が得られます。
line_name | device_name | count |
---|---|---|
1003 | 3548003 | 6 |
2002 | 3548008 | 9 |
補足
- このクエリは、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_name | device_name | count |
---|---|---|
1003 | 3548003 | 6 |
2002 | 3548008 | 9 |
このコードをどのように使用すればよいですか?
このコードを次の方法で使用できます。
- 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_name | device_name | count |
---|---|---|
2002 | 3548008 | 9 |
1003 | 3548003 | 6 |
方法 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_name | device_name | count |
---|---|---|
2002 | 3548008 | 9 |
1003 | 3548003 | 6 |
どの方法を選択する必要がありますか?
選択する方法は、ニーズによって異なります。
- シンプルで使いやすい方法 を探している場合は、方法 1 を使用してください。
- MariaDB 10.2.7 を使用している場合は、方法 1 を使用する必要があります。
上記以外にも、2 件のランダムかつ個別レコードを取得する方法はいくつかあります。
- 一時テーブル を使用する方法
これらの方法は、より複雑で、上記の方法よりもパフォーマンスが低くなる可能性があります。
mysql sql mariadb