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

MySQL-এ গ্রুপ বাই করলে র‍্যান্ডম অর্ডারে ফলাফল পাওয়া

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     |
+----+-------+

ব্যাখ্যা:

  1. সাবকোয়েরি: SELECT Value, RAND() AS random_Value FROM DemoTable GROUP BY Value - প্রতিটি ইউনিক Value-এর জন্য একটি র‍্যান্ডম সংখ্যা জেনারেট করে
  2. জয়িন: মূল টেবিলের সাথে সাবকোয়েরি জয়িন করে
  3. ORDER BY tbl2.random_Value - সেই র‍্যান্ডম সংখ্যা দিয়ে গ্রুপগুলো সর্ট করে
  4. গ্রুপের ভিতরে রোগুলো আপনার প্রাইমারি কী বা ন্যাচারাল অর্ডারে থাকে

স্রtablishment: কেন এই পদ্ধতি?

MySQL-এ GROUP BY ডিফল্টভাবে গ্রুপিং কী দিয়ে সর্ট করে (MySQL 5.7 পর্যন্ত)। ৮.০+ এ ডিফল্ট সর্টিং নেই। র‍্যান্ডম অর্ডার চাইলে এই ট্রিক ব্যবহারী।

সতর্কতা

  • RAND() প্রতিবার এক্সিকিউশনে নতুন মান দেয়
  • বড় টেবিলে পারফরম্যান্স ইস্যু হতে পারে (ফুল টেবিল স্ক্যান + সর্ট)
  • ডিটারমিনিস্টিক রেজাল্ট চাইলে RAND(seed) ব্যবহার করুন
  1. MySQL ডেটাবেসে & কে অ্যাম্পারস্যান্ড (&) দিয়ে প্রতিস্থাপন করার পদ্ধতি

  2. MySQL SELECT 1 ব্যবহার করে ভ্যালু এক্সিস্ট করে কিনা চেক করার পদ্ধতি

  3. MySQL-এ GROUP BY ক্লজে সাবকোয়েরি ব্যবহার করে প্রতিটি গ্রুপের প্রথম রো নির্বাচন করুন

  4. MySQL-এ বিশেষ ক্যারেক্টারযুক্ত মান খুঁজে NULL দিয়ে প্রতিস্থাপন করা