ফলাফলে নির্দিষ্ট ক্যাটাগরির সারিগুলো প্রথমে র্যান্ডম ক্রমে এবং বাকি ক্যাটাগরির সারি الآخر সর্টেড ক্রমে দেখাতে ORDER BY CASE এক্সপ্রেশন ব্যবহার করা হয়।
টেবিল ও ডেটা তৈরি
mysql> CREATE TABLE DemoTable1926 (
Position VARCHAR(20),
Number INT
);
mysql> INSERT INTO DemoTable1926 VALUES
('Highest', 50), ('Highest', 30),
('Lowest', 100), ('Lowest', 120), ('Lowest', 90);
ডেটা যাচাই
mysql> SELECT * FROM DemoTable1926;
+----------+--------+ | Position | Number | +----------+--------+ | Highest | 50 | | Highest | 30 | | Lowest | 100 | | Lowest | 120 | | Lowest | 90 | +----------+--------+
কোয়েরি: Highest প্রথমে র্যান্ডম, Lowest পরে Number অনুযায়ী ASC
mysql> SELECT * FROM DemoTable1926
ORDER BY Position DESC,
CASE Position WHEN 'Highest' THEN RAND() ELSE Number END ASC;
ব্যাখ্যা:
Position DESC— 'Lowest' (L) > 'Highest' (H) লেক্সিকোগ্রাফিক্যালি, তাই DESC দিলে Highest আগে আসে।CASE WHEN 'Highest' THEN RAND() ELSE Number END— Highest গ্রুপের জন্য র্যান্ডম সর্ট, Lowest-এর জন্য Number ASC।
সম্ভাব্য আউটপুট (RAND() এর কারণে প্রতিবার ভিন্ন):
+----------+--------+ | Position | Number | +----------+--------+ | Lowest | 90 | | Lowest | 100 | | Lowest | 120 | | Highest | 50 | | Highest | 30 | +----------+--------+
বিকল্প: UNION ALL পদ্ধতি (নির্দিষ্ট ক্রমে)
(SELECT * FROM DemoTable1926 WHERE Position = 'Highest' ORDER BY RAND()) UNION ALL (SELECT * FROM DemoTable1926 WHERE Position = 'Lowest' ORDER BY Number);
কোনটি ব্যবহার করবেন?
- ORDER BY CASE: একক কোয়েরি, ইনডেক্স ব্যবহার করতে পারে, পেজিনেশন সহজ।
- UNION ALL: লজিক স্পষ্ট, কিন্তু পেজিনেশন জটিল।