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

การใช้ ORDER BY RAND() และจับกลุ่มข้อมูลใน MySQL

ภาพรวม

ต้องการสุ่มลำดับแถวแต่ยังคงจับกลุ่มค่าที่เหมือนกันไว้ด้วยกัน ใช้ ORDER BY RAND(StudentMarks * 100 * RAND()) สร้างค่าสุ่มที่ขึ้นกับค่าคอลัมน์ ทำให้แถวที่มีค่าเท่ากันได้ค่าสุ่มใกล้เคียงกัน

ขั้นตอน

  1. สร้างตาราง DemoTable มี StudentId (PK, AI) และ StudentMarks
  2. แทรกข้อมูลมีค่าซ้ำ: 98, 98, 78, 78, 45, 56
  3. Query ด้วย ORDER BY RAND(StudentMarks * 100 * RAND())

โค้ด SQL

CREATE TABLE DemoTable (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentMarks INT
);

INSERT INTO DemoTable (StudentMarks) VALUES (98);
INSERT INTO DemoTable (StudentMarks) VALUES (98);
INSERT INTO DemoTable (StudentMarks) VALUES (78);
INSERT INTO DemoTable (StudentMarks) VALUES (78);
INSERT INTO DemoTable (StudentMarks) VALUES (45);
INSERT INTO DemoTable (StudentMarks) VALUES (56);

SELECT * FROM DemoTable;

-- สุ่มแต่จับกลุ่มค่าเดียวกัน
SELECT * FROM DemoTable ORDER BY RAND(StudentMarks * 100 * RAND());

ผลลัพธ์ตัวอย่าง

+-----------+--------------+
| StudentId | StudentMarks |
+-----------+--------------+
| 3         | 78           |
| 6         | 56           |
| 5         | 45           |
| 4         | 78           |
| 1         | 98           |
| 2         | 98           |
+-----------+--------------+

สรุป

  • RAND(expr) ใช้ expr เป็น seed ทำให้แถวที่มีค่า StudentMarks เท่ากันได้ลำดับสุ่มใกล้เคียง
  • วิธีนี้ไม่รับประกันจับกลุ่ม 100% แต่ลดโอกาสแยกกลุ่ม
  • สำหรับการจับกลุ่มจริง ควรใช้ GROUP BY หรือ window functions