MySQL-এ GROUP BY করার পর গ্রুপগুলো র্যান্ডম অর্ডারে দেখাতে চাইলে সাবকোয়েরিতে RAND() ব্যবহার করে একটি র্যান্ডম ভ্যালু জেনারেট করে সেটি দিয়ে অর্ডার করতে হয়।
টেবিল তৈরি এবং ডেটা ইনসার্ট
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value CHAR(1)
-> );
mysql> INSERT INTO DemoTable(Value) VALUES('X');
mysql> INSERT INTO DemoTable(Value) VALUES('Y');
mysql> INSERT INTO DemoTable(Value) VALUES('X');
mysql> INSERT INTO DemoTable(Value) VALUES('X');
mysql> INSERT INTO DemoTable(Value) VALUES('Y');
mysql> INSERT INTO DemoTable(Value) VALUES('Z');
mysql> INSERT INTO DemoTable(Value) VALUES('Z');
সব রেকর্ড দেখুন
mysql> SELECT * FROM DemoTable;
+----+-------+
| Id | Value |
+----+-------+
| 1 | X |
| 2 | Y |
| 3 | X |
| 4 | X |
| 5 | Y |
| 6 | Z |
| 7 | Z |
+----+-------+
কেস ১: গ্রুপ বাই র্যান্ডম অর্ডার (প্রথম রান)
mysql> SELECT DemoTable.*
-> FROM DemoTable
-> JOIN (
-> SELECT Value, RAND() AS `random_Value`
-> FROM DemoTable
-> GROUP BY Value
-> ) tbl2
-> ON DemoTable.Value = tbl2.Value
-> ORDER BY tbl2.`random_Value`;
ফলাফল (র্যান্ডম গ্রুপ অর্ডার)
+----+-------+
| Id | Value |
+----+-------+
| 6 | Z |
| 7 | Z |
| 1 | X |
| 3 | X |
| 4 | X |
| 2 | Y |
| 5 | Y |
+----+-------+
কেস ২: আবার রান করলে অর্ডার বদলবে (দ্বিতীয় রান)
+----+-------+
| Id | Value |
+----+-------+
| 2 | Y |
| 5 | Y |
| 6 | Z |
| 7 | Z |
| 1 | X |
| 3 | X |
| 4 | X |
+----+-------+
ব্যাখ্যা:
- সাবকোয়েরি:
SELECT Value, RAND() AS random_Value FROM DemoTable GROUP BY Value- প্রতিটি ইউনিক Value-এর জন্য একটি র্যান্ডম সংখ্যা জেনারেট করে - জয়িন: মূল টেবিলের সাথে সাবকোয়েরি জয়িন করে
ORDER BY tbl2.random_Value- সেই র্যান্ডম সংখ্যা দিয়ে গ্রুপগুলো সর্ট করে- গ্রুপের ভিতরে রোগুলো আপনার প্রাইমারি কী বা ন্যাচারাল অর্ডারে থাকে
স্রtablishment: কেন এই পদ্ধতি?
MySQL-এ GROUP BY ডিফল্টভাবে গ্রুপিং কী দিয়ে সর্ট করে (MySQL 5.7 পর্যন্ত)। ৮.০+ এ ডিফল্ট সর্টিং নেই। র্যান্ডম অর্ডার চাইলে এই ট্রিক ব্যবহারী।
সতর্কতা
RAND()প্রতিবার এক্সিকিউশনে নতুন মান দেয়- বড় টেবিলে পারফরম্যান্স ইস্যু হতে পারে (ফুল টেবিল স্ক্যান + সর্ট)
- ডিটারমিনিস্টিক রেজাল্ট চাইলে
RAND(seed)ব্যবহার করুন