Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

จัดกลุ่มข้อมูลแต่เรียงลำดับกลุ่มแบบสุ่มด้วย RAND() ใน MySQL

ใช้ 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     |
+----+-------+

คำอธิบาย:

  1. Subquery: GROUP BY Value ได้ 3 กลุ่ม (X, Y, Z) แต่ละกลุ่มได้ RAND() ตัวเลขสุ่มต่างกัน
  2. JOIN กลับมา: แต่ละแถวได้ค่าสุ่มของกลุ่มตัวเอง
  3. ORDER BY ค่าสุ่ม: กลุ่มที่สุ่มได้น้อยกว่าจะอยู่บน

ภายในกลุ่ม: ลำดับแถวไม่ได้รับการสั่ง (ขึ้นกับ storage engine) — เพิ่ม ORDER BY tbl2.random_Value, DemoTable.Id ถ้าต้องการเรียงในกลุ่มด้วย