সেমিকোলন (;) সেপারেটরকে কমা (,) বদলে 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) ভালো সমাধান।