ภาพรวม
ต้องการสุ่มลำดับแถวแต่ยังคงจับกลุ่มค่าที่เหมือนกันไว้ด้วยกัน ใช้ ORDER BY RAND(StudentMarks * 100 * RAND()) สร้างค่าสุ่มที่ขึ้นกับค่าคอลัมน์ ทำให้แถวที่มีค่าเท่ากันได้ค่าสุ่มใกล้เคียงกัน
ขั้นตอน
- สร้างตาราง
DemoTableมีStudentId(PK, AI) และStudentMarks - แทรกข้อมูลมีค่าซ้ำ: 98, 98, 78, 78, 45, 56
- 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