কম্পিউটার টিউটোরিয়াল

MySQL-এ LEFT JOIN ব্যবহার করে ডুপ্লিকেট রেকর্ড মুছে ফেলা (রखতে চাই প্রথম রো)

ডুপ্লিকেট রেকর্ড মুছে ফেলার একটি পদ্ধতি হলো 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)।

  1. MySQL-এ LIMIT 1 ব্যবহার করে ডুপ্লিকেট রেকর্ড থেকে শুধু একটি ডিলিট করুন

  2. MySQL-এ JOIN ব্যবহার করে দুই টেবিল থেকে ডেটা ফেচ করা

  3. MySQL-এ INSERT INTO SELECT ব্যবহার করে অন্য টেবিল থেকে ডেটা কপি করা

  4. MySQL-এ JOIN ব্যবহার করে অন্য টেবিল থেকে ID দিয়ে Username বের করা