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

MySQL-এ FIND_IN_SET() + REPLACE() দিয়ে সেমিকোলন-সেপারেটেড লিস্ট থেকে মান খুঁজে বের করা


সেমিকোলন (;) সেপারেটরকে কমা (,) বদলে FIND_IN_SET ব্যবহার করা

MySQL-এ FIND_IN_SET() শুধু কমা-সেপারেটেড স্ট্রিং-এ কাজ করে। সেমিকোলন-সেপারেটেড ডেটার জন্য REPLACE() দিয়ে কমায় কনভার্ট করেই ব্যবহার করা যায়।

টেবিল ও ডেটা

mysql> CREATE TABLE DemoTable (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Value VARCHAR(100));
mysql> INSERT INTO DemoTable(Value) VALUES('100;200;300'), ('1;300;400'), ('6;7;8;9;10'), ('1;2;3;4;5'), ('3;8;9;10');

সব রেকর্ড

+----+-------------+
| Id | Value       |
+----+-------------+
| 1  | 100;200;300 |
| 2  | 1;300;400   |
| 3  | 6;7;8;9;10  |
| 4  | 1;2;3;4;5   |
| 5  | 3;8;9;10    |
+----+-------------+

FIND_IN_SET + REPLACE কোয়েরি (মান ৮ খুঁজা)

mysql> SELECT * FROM DemoTable 
WHERE FIND_IN_SET(8, REPLACE(Value, ';', ',')) > 0;
+----+------------+
| Id | Value      |
+----+------------+
| 3  | 6;7;8;9;10 |
| 5  | 3;8;9;10   |
+----+------------+

ব্যাখ্যা

  • REPLACE(Value, ';', ',') — সেমিকোলনকে কমায় বদলে '6,7,8,9,10' বানায়।
  • FIND_IN_SET(8, ...) — কনভার্টেড স্ট্রিংয়ে ৮ আছে কিনা চেক করে (পজিশন > 0 মানে TRUE)।
  • > 0 — স্পষ্টভাবে TRUE চেক (FIND_IN_SET ০ রিটার্ন করলে FALSE)।

সতর্কতা

  • স্ট্রিং-ভিত্তিক সার্চ, ইনডেক্স ব্যবহার হয় না।
  • বড় ডেটাসেটে নরমালাইজেশন (child table) ভালো সমাধান।
  1. MySQL-এ নির্দিষ্ট কলাম নামে টেবিল খুঁজে বের করা

  2. MySQL-এ কমা-সেপারেটেড কলাম থেকে নির্দিষ্ট মান খোঁজা (FIND_IN_SET)

  3. MySQL-এ GREATEST() ফাংশন ব্যবহার করে একাধিক কলামে NULL আছে কিনা যাচাই করা

  4. MySQL-এ স্ট্রিং কলাম থেকে নির্দিষ্ট প্যাটার্নের রেকর্ড বের করা (স্ট্রিং, সংখ্যা, স্পেশাল ক্যারেক্টার)