ใช้ Subquery กำหนดค่าสุ่มต่อกลุ่ม แล้ว JOIN กลับมาเรียงตามค่าสุ่ม
สร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value CHAR(1)
);
mysql> INSERT INTO DemoTable(Value) VALUES
('X'), ('Y'), ('X'), ('X'), ('Y'), ('Z'), ('Z');
ดูข้อมูล
mysql> SELECT * FROM DemoTable;
+----+-------+
| Id | Value |
+----+-------+
| 1 | X |
| 2 | Y |
| 3 | X |
| 4 | X |
| 5 | Y |
| 6 | Z |
| 7 | Z |
+----+-------+
คำสั่ง: จัดกลุ่มตาม Value แต่เรียงลำดับกลุ่มแบบสุ่ม
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`;
ผลลัพธ์ครั้งที่ 1 (กลุ่ม Z ก่อน, ตามด้วย X, Y)
+----+-------+
| Id | Value |
+----+-------+
| 6 | Z |
| 7 | Z |
| 1 | X |
| 3 | X |
| 4 | X |
| 2 | Y |
| 5 | Y |
+----+-------+
ผลลัพธ์ครั้งที่ 2 (กลุ่ม Y ก่อน, ตามด้วย Z, X)
+----+-------+
| Id | Value |
+----+-------+
| 2 | Y |
| 5 | Y |
| 6 | Z |
| 7 | Z |
| 1 | X |
| 3 | X |
| 4 | X |
+----+-------+
คำอธิบาย:
- Subquery:
GROUP BY Valueได้ 3 กลุ่ม (X, Y, Z) แต่ละกลุ่มได้RAND()ตัวเลขสุ่มต่างกัน - JOIN กลับมา: แต่ละแถวได้ค่าสุ่มของกลุ่มตัวเอง
- ORDER BY ค่าสุ่ม: กลุ่มที่สุ่มได้น้อยกว่าจะอยู่บน
ภายในกลุ่ม: ลำดับแถวไม่ได้รับการสั่ง (ขึ้นกับ storage engine) — เพิ่ม ORDER BY tbl2.random_Value, DemoTable.Id ถ้าต้องการเรียงในกลุ่มด้วย