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

MySQLテーブルに保存された逆順の重複値を削除する方法

MySQLテーブルから逆順の重複値を削除する方法

データベースを運用していると、(Delhi, Nagpur) と (Nagpur, Delhi) のように、2つの列の値が入れ替わっただけの「逆順の重複」データが混在することがあります。本記事では、サンプルテーブルを使って、こうした重複行を除外・削除する方法を解説します。

サンプルテーブルの確認

ここでは、次のような details_city テーブルを使用します。

mysql> Select * from details_city;
+--------+--------+
| City1  | City2  |
+--------+--------+
| Delhi  | Nagpur |
| Delhi  | Mumbai |
| Nagpur | Delhi  |
| Katak  | Delhi  |
| Delhi  | Katak  |
+--------+--------+
5 rows in set (0.00 sec)

このテーブルには、(Delhi, Nagpur) と (Nagpur, Delhi)、(Katak, Delhi) と (Delhi, Katak) のように、都市名の並びが逆になっているだけの重複行が含まれています。

比較条件を使って重複行を除外する

逆順の重複を排除するポイントは、WHERE句で2つの列の値を比較することです。以下のクエリでは、city1 が city2 以下である行だけを抽出しています。

mysql> Select a.city1,a.city2 from details_city a WHERE a.city1 <= a.city2;
+-------+--------+
| city1 | city2  |
+-------+--------+
| Delhi | Nagpur |
| Delhi | Mumbai |
| Delhi | Katak  |
+-------+--------+
3 rows in set (0.06 sec)

仕組みの解説

文字列同士の比較は、辞書順(アルファベット順)で判定されます。たとえば「Delhi」と「Nagpur」を比べると、D は N より前にあるため Delhi <= Nagpur が成立し、(Delhi, Nagpur) の行は残ります。一方、(Nagpur, Delhi) の行は条件を満たさないため除外されます。この仕組みにより、各ペアの中から必ず1行だけが残るわけです。

実際にデータを削除する場合

抽出ではなく、テーブルから本当に重複行を削除したい場合は、同じ考え方を DELETE 文に応用します。city1 が city2 より大きい行を削除すれば、逆順の重複だけを取り除けます。

mysql> Delete from details_city WHERE city1 > city2;
Query OK, 2 rows affected (0.05 sec)

このように、列の値を比較するシンプルな条件を追加するだけで、逆順の重複データを効率的に整理できます。大量のデータを扱う際も、インデックスを適切に設定しておけば高速に処理できるため、実務でも広く使われる手法です。

  1. MySQLで月ごとにテーブルの値を合計する方法を解説

    MySQLでテーブル内の値を月ごとに合計したい場合は、EXTRACT()関数を使用します。この関数を使うことで、日付から特定の月の情報を抽出できます。例えば、年に関係なく1月のすべての価格を合計したい場合などに便利です。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable1415 -> ( -> ProductPurchaseDate date, -> ProductPrice int -> ); Query OK, 0 rows affected (0.53 se

  2. MySQLで重複レコードを含むテーブルから特定の値を1件だけ削除する方法

    MySQLでテーブル内のレコードを削除するにはDELETE文を使用します。しかし、同じ値の重複レコードが複数存在する場合に、そのうち1件だけを削除したいケースがあります。そんなときは、LIMIT句を組み合わせることで、削除対象の件数を制限できます。基本構文delete from yourTableName where yourColumnName=yourValue limit 1;この構文では、WHERE句で削除対象の条件を指定し、LIMIT 1によって該当するレコードのうち最初の1件のみを削除します。実際にテーブルを作成して確認してみようまず、サンプル用のテーブルを作成します。mysql&