MySQL-এ 'A10', 'A2', 'A100' এর মতো স্ট্রিং-সংখ্যা মিশ্র কলাম সঠিক সংখ্যাসূচক ক্রমে সাজাতে SUBSTR() এবং CAST(... AS UNSIGNED) ব্যবহার করুন।
সিনট্যাক্স
SELECT * FROM yourTableName ORDER BY SUBSTR(yourColumnName FROM 1 FOR 2), CAST(SUBSTR(yourColumnName FROM 2) AS UNSIGNED);
ব্যাখ্যা: প্রথমে অক্ষর অংশ (প্রিফিক্স) দিয়ে সাজানো, তারপর সংখ্যা অংশকে ইন্টিজার হিসেবে কাস্ট করে সাজানো।
উদাহরণ
টেবিল তৈরি করি:
mysql> create table OrderByStringWithNumbers
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Words varchar(10),
-> PRIMARY KEY(Id)
-> ); Query OK, 0 rows affected (0.86 sec)
রেকর্ড ইনসার্ট:
mysql> insert into OrderByStringWithNumbers(Words) values('A10');
mysql> insert into OrderByStringWithNumbers(Words) values('A30');
mysql> insert into OrderByStringWithNumbers(Words) values('A12');
mysql> insert into OrderByStringWithNumbers(Words) values('A11');
mysql> insert into OrderByStringWithNumbers(Words) values('A28');
mysql> insert into OrderByStringWithNumbers(Words) values('A21');
সকল রেকর্ড (ডিফল্ট স্ট্রিং সর্ট)
mysql> select *from OrderByStringWithNumbers;
আউটপুট
+----+-------+ | Id | Words | +----+-------+ | 1 | A10 | | 2 | A30 | | 3 | A12 | | 4 | A11 | | 5 | A28 | | 6 | A21 | +----+-------+
সমস্যা: স্ট্রিং সর্টে A10, A11, A12, A21, A28, A30 হওয়া উচিত কিন্তু আসে A10, A11, A12, A21, A28, A30 — আসলে ডিফল্ট স্ট্রিং সর্টে A10, A11, A12, A21, A28, A30 সঠিক হয়। কিন্তু A2, A10 হলে সমস্যা হয়।
সঠিক সংখ্যাসূচক ক্রমে সাজান
mysql> SELECT * FROM OrderByStringWithNumbers ORDER BY SUBSTR(Words FROM 1 FOR 2), CAST(SUBSTR(Words FROM 2) AS UNSIGNED);
ফলাফল
+----+-------+ | Id | Words | +----+-------+ | 1 | A10 | | 4 | A11 | | 3 | A12 | | 6 | A21 | | 5 | A28 | | 2 | A30 | +----+-------+
সীমাবদ্ধতা: এই সিনট্যাক্স ঠিক ১ অক্ষরের প্রিফিক্সের জন্য। বহু-অক্ষরের প্রিফিক্স (যেমন 'AB10') হলে REGEXP বা GENERATED COLUMN ব্যবহার করা ভালো।