DISTINCT、GROUP BY、サブクエリ駆使!MySQLで列の重複を取り除くテクニック
PHP、MySQL、SQL を使用して列から一意の値を選択する方法
このチュートリアルでは、PHP、MySQL、SQL を使用してデータベース表の列から一意の値を選択する方法を説明します。3 つの異なる方法を紹介します。
- DISTINCT キーワード
- GROUP BY 句
- 副問合せ
それぞれの方法について、具体的なコード例と実行結果を示します。
前提知識
このチュートリアルを理解するには、以下の知識が必要です。
- PHP の基本的な構文
- MySQL データベースの使用方法
- SQLクエリの実行方法
使用するデータベース
このチュートリアルでは、次の構造を持つ users
テーブルを使用します。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
このテーブルには、id
、name
、email
、created_at
の 4 つの列があります。
DISTINCT
キーワードは、SELECT クエリの結果から重複する値を削除するために使用されます。 以下は、name
列から一意の値を選択する例です。
<?php
$conn = new mysqli('localhost', 'username', 'password', 'database_name');
$sql = "SELECT DISTINCT name FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo $row['name'] . "<br>";
}
} else {
echo "一意の値が見つかりませんでした。";
}
$conn->close();
このコードを実行すると、次の出力が得られます。
Alice
Bob
Charlie
GROUP BY
句は、SELECT クエリの結果をグループ化するために使用されます。 各グループに対して、集計関数 (COUNT、SUM、AVG など) を適用することもできます。 以下は、name
列の値をグループ化し、各グループのレコード数をカウントする例です。
<?php
$conn = new mysqli('localhost', 'username', 'password', 'database_name');
$sql = "SELECT name, COUNT(*) AS count FROM users GROUP BY name";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo $row['name'] . ": " . $row['count'] . "<br>";
}
} else {
echo "一意の値が見つかりませんでした。";
}
$conn->close();
Alice: 1
Bob: 1
Charlie: 1
方法 3: 副問合せ
副問合せは、別のクエリの結果を返すクエリです。 以下は、name
列から一意の値を選択する副問合せを使用した例です。
<?php
$conn = new mysqli('localhost', 'username', 'password', 'database_name');
$sql = "SELECT name FROM users WHERE name IN (
SELECT DISTINCT name FROM users
)";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo $row['name'] . "<br>";
}
} else {
echo "一意の値が見つかりませんでした。";
}
$conn->close();
このコードは、方法 1 と同じ結果を生成します。
このチュートリアルでは、PHP、MySQL、SQL を使用してデータベース表の列から一意の値を選択する方法を 3 通り紹介しました。 それぞれの方法には長所と短所があるので、状況に応じて適切な方法を選択してください。
補足
- より複雑なクエリを作成するには、WHERE 句、ORDER BY 句、LIMIT 句などの他の SQL 句を組み合わせることができます。
- PHP でデータベースを操作するには、MySQLi拡張モジュールを使用する必要があります。
- MySQL データベースに接続するには、ホスト名、ユーザー名、パスワード、データベース名などの接続情報が必要です。
このチュートリアルが、PHP、MySQL、SQL を使用してデータベースからデータを操作
<?php
$conn = new mysqli('localhost', 'username', 'password', 'database_name');
$sql = "SELECT DISTINCT name FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo $row['name'] . "<br>";
}
} else {
echo "一意の値が見つかりませんでした。";
}
$conn->close();
このコードは以下の動作をします。
mysqli
拡張機能を使用して、MySQL データベースへの接続を確立します。DISTINCT name FROM users
という SQL クエリを実行します。 このクエリは、users
テーブルのname
列から重複する値を削除して、一意の値のみを選択します。- クエリの結果をフェッチし、各行をループ処理します。
- 各行の
name
カラムの値を出力します。 - データベース接続を閉じます。
実行方法
- 上記のコードをエディタに保存します。
- ファイルを
.php
拡張子で保存します。 - Web サーバーでファイルをホストします。
出力
Alice
Bob
Charlie
説明
mysqli_connect()
関数は、MySQL データベースへの接続を確立します。 この関数は、ホスト名、ユーザー名、パスワード、データベース名を引数として取ります。mysqli_query()
関数は、SQL クエリを実行します。 この関数は、SQL クエリ文字列を引数として取ります。mysqli_fetch_assoc()
関数は、クエリの結果から連想配列を返します。 この配列には、各列名のキーと、その列の値が含まれています。echo
ステートメントは、文字列を出力します。mysqli_close()
関数は、データベース接続を閉じます。
このコードはあくまで一例であり、状況に応じて変更する必要があります。 例えば、別のデータベースに接続したい場合は、接続情報を変更する必要があります。 また、別の列から一意の値を選択したい場合は、DISTINCT
の後に列名を指定する必要があります。
以下のコードは、サブクエリを使用して一意の値を選択する方法を示しています。
SELECT name
FROM users
WHERE name NOT IN (
SELECT name
FROM users
GROUP BY name
HAVING COUNT(*) > 1
);
このクエリは、以下の手順で動作します。
- 内側のサブクエリは、
name
列の値をグループ化し、各グループのレコード数をカウントします。 - 外側のクエリは、
users
テーブルからname
列の値を選択します。 - 外側のクエリは、
WHERE
句を使用して、内側のサブクエリでカウント数が 1 を超えたname
値を除外します。
ウィンドウ関数
SELECT name
FROM users
ORDER BY name
ROW_NUMBER() OVER (PARTITION BY name ORDER BY name) AS row_num
HAVING row_num = 1;
ORDER BY name
句を使用して、name
列の値を昇順にソートします。ROW_NUMBER()
ウィンドウ関数は、各行に一意の行番号を割り当てます。PARTITION BY name
句を使用して、行番号をname
列の値ごとにグループ化します。HAVING
句を使用して、行番号が 1 の行のみを選択します。
仮想テーブル
CREATE TEMPORARY TABLE unique_names (
name VARCHAR(255) NOT NULL
);
INSERT INTO unique_names (name)
SELECT DISTINCT name
FROM users;
SELECT name
FROM unique_names;
unique_names
という名前の仮想テーブルを作成します。DISTINCT
キーワードを使用して、users
テーブルから一意のname
値をunique_names
テーブルに挿入します。
上記で紹介した方法は、それぞれ異なる長所と短所があります。 状況に応じて適切な方法を選択してください。
長所と短所
- DISTINCT キーワード
- 長所: 簡単で分かりやすい
- 短所: 他の方法よりも時間がかかる場合がある
- サブクエリ
- 長所: 柔軟性が高い
- ウィンドウ関数
- 長所: 高速で効率的
- 短所: MySQL 8 以降でのみ使用可能
- 仮想テーブル
- 長所: 読みやすくメンテナンスしやすい
- 短所: 一時的なテーブルなので、クエリが終了すると削除される
php mysql sql