ডুপ্লিকেট রেকর্ড মুছে ফেলার একটি পদ্ধতি হলো LEFT JOIN ব্যবহার করে প্রথম বারের রো (সাধারণত মিনিমাম ID) রাখা এবং বাকিগুলো ডিলিট করা।
টেবিল তৈরি ও ডেটা ইনসার্ট (ডুপ্লিকেট সহ)
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(100)
);
Query OK, 0 rows affected (0.46 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Chris');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Robert');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Robert');
Query OK, 1 row affected (0.07 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('John');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('John');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Mike');
Query OK, 1 row affected (0.09 sec)
রেকর্ড দেখানো
mysql> SELECT * FROM DemoTable;
আউটপুট:
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 3 | Robert | | 4 | John | | 5 | John | | 6 | Mike | +----+-----------+ 6 rows in set (0.00 sec)
LEFT JOIN দিয়ে ডুপ্লিকেট ডিলিট (প্রথম ID রাখে)
mysql> DELETE tbl FROM DemoTable tbl
LEFT JOIN (
SELECT MIN(Id) AS Id, FirstName
FROM DemoTable
GROUP BY FirstName
) tbl1 ON tbl.Id = tbl1.Id AND tbl.FirstName = tbl1.FirstName
WHERE tbl1.Id IS NULL;
Query OK, 2 rows affected (0.16 sec)
ডিলিট পর রেকর্ড
mysql> SELECT * FROM DemoTable;
ফলাফল (প্রথম ID রাখা হয়েছে):
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 4 | John | | 6 | Mike | +----+-----------+ 4 rows in set (0.00 sec)
ব্যাখ্যা
- সাবকোয়েরি: প্রতিটি FirstName-এর জন্য ন্যূনতম Id বের করে (প্রথম রো)।
LEFT JOIN- মূল টেবিলের সব রো রাখে, ম্যাচ না হলে tbl1.Id NULL হয়।WHERE tbl1.Id IS NULL- যেগুলো ম্যাচ নাই (ডুপ্লিকেট), সেগুলো ডিলিট।
আধুনিক পদ্ধতি (MySQL 8.0+): CTE + ROW_NUMBER
WITH ranked AS (
SELECT Id, FirstName, ROW_NUMBER() OVER (PARTITION BY FirstName ORDER BY Id) AS rn
FROM DemoTable
)
DELETE FROM DemoTable WHERE Id IN (SELECT Id FROM ranked WHERE rn > 1);
এটি আরও পঠনযোগ্য এবং ফ্লেক্সিবল (যেমন: সর্বশেষ রো রাখতে চাইলে ORDER BY Id DESC)।