MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

同じNameが複数存在する行からランダムな値(IdとName)を取得するMySQLクエリ

重複して存在する特定の「Name」の中から、ランダムに1行分の値(IdとName)を取得したい場合は、RAND()関数でランダムな順序に並べ替え、LIMIT 1で結果を1件に絞ります。さらにWHERE句を使って、対象となる特定の「Name」を指定します。

サンプルテーブルの作成

まず、以下のようにテーブルを作成します。

mysql> create table DemoTable
(
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name varchar(20)
);
Query OK, 0 rows affected (1.65 sec)

レコードの挿入

次に、INSERT文でいくつかのレコードを挿入します。ここでは「Bob」が複数回登場するようにしています。

mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(Name) values('Bob');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Name) values('David');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable(Name) values('Bob');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Name) values('Bob');
Query OK, 1 row affected (0.08 sec)

テーブルの中身を確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行結果は以下の通りです。「Bob」が3件登録されていることがわかります。

+----+-------+
| Id | Name  |
+----+-------+
|  1 | Chris |
|  2 | Bob   |
|  3 | David |
|  4 | Bob   |
|  5 | Bob   |
+----+-------+
5 rows in set (0.65 sec)

ランダムな行を取得するクエリ

重複している「Name」の中からランダムに1件を取得するには、ORDER BY RAND() と LIMIT 1 を組み合わせます。

mysql> select *from DemoTable where Name='Bob' order by rand() limit 1;

実行結果の例は以下の通りです。実行するたびに、該当する「Bob」の行からランダムに異なるIdが返される可能性があります。

+----+------+
| Id | Name |
+----+------+
| 5  | Bob  |
+----+------+
1 row in set (0.00 sec)

このように、WHERE句で対象の名前に絞り込み、ORDER BY RAND() と LIMIT 1 を組み合わせることで、複数回出現する値の中からランダムに1行を選択できます。なお、大規模なテーブルに対しては RAND() の並べ替えにコストがかかるため、パフォーマンスが求められる場面では別の手法(乱数生成後にIDで検索する方法など)も検討するとよいでしょう。

  1. MySQLで最大・最小の給与行を選択するクエリの書き方

    MySQLで最大・最小の給与行を取得する方法テーブルから給与が最も高い行と最も低い行を同時に取得したい場合は、サブクエリとMIN()関数・MAX()関数を組み合わせます。さらに、最大値と最小値の両方を一度に扱うためにUNION ALLを使用します。ここでは、テーブル作成から結果確認までの手順をサンプルコードとともに解説します。1. サンプルテーブルの作成まず、従業員名と給与を格納するテーブルを作成しましょう。mysql> create table DemoTable    -> (    -> E

  2. MySQLで列が複数の値をすべて満たす行を選択する方法|GROUP BY・HAVING句の使い方

    MySQLである列が「複数の値をすべて満たしている」行だけを抽出したい場合、IN()句と GROUP BY、そして HAVING 句を組み合わせることで実現できます。この記事では、具体的なサンプルを使いながら手順をわかりやすく解説します。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここでは氏名(FirstName)と科目(Subject)を持つシンプルなテーブルを用意しました。mysql> create table DemoTable1885 ( FirstName varchar(20), Subject varchar(50)