การสุ่มข้อมูลด้วย ORDER BY RAND() และ Stored Procedure
MySQL ไม่มีฟังก์ชันสุ่มตัวเลข built-in แบบโปรแกรมมิ่งทั่วไป แต่สามารถสุ่มแถวข้อมูลได้ด้วย ORDER BY RAND() แล้วค่อย LIMIT จำนวนที่ต้องการ
สร้าง Stored Procedure สุ่ม 5 ค่า
DELIMITER //
CREATE PROCEDURE generate_Random5Numbers()
BEGIN
SELECT GROUP_CONCAT(Value SEPARATOR '/')
FROM (
SELECT Value
FROM (
SELECT Value
FROM DemoTable
WHERE Value BETWEEN 10 AND 100
ORDER BY RAND()
LIMIT 5
) AS Ascending_Order
ORDER BY Value
) AS FiveValues;
END //
DELIMITER ;
อธิบายโครงสร้าง
- WHERE Value BETWEEN 10 AND 100 - กรองช่วงค่าที่ต้องการสุ่ม
- ORDER BY RAND() - สลับลำดับแถวแบบสุ่ม
- LIMIT 5 - เอาแค่ 5 แถวแรกหลังสุ่ม
- Subquery Ascending_Order - เรียงค่าที่สุ่มได้จากน้อยไปมาก
- GROUP_CONCAT(... SEPARATOR '/') - รวมค่าเป็นสตริงคั่นด้วย /
การเรียกใช้งาน
CALL generate_Random5Numbers();
ผลลัพธ์ตัวอย่าง:
+-----------------------------------+
| GROUP_CONCAT(Value SEPARATOR '/') |
+-----------------------------------+
| 89/74/78/99/10 |
+-----------------------------------+
ข้อควรระวังเรื่อง Performance
ORDER BY RAND()ช้าเมื่อตารางใหญ่ (Full Table Scan + Filesort)- สำหรับตาราง > 10,000 แถว แนะนำใช้วิธีอื่น เช่น:
- สุ่ม Primary Key range แล้ว JOIN
- ใช้
RAND()ใน WHERE clause แทน - เก็บค่าสุ่มไว้ใน Column แยกต่างหาก
ตัวอย่างวิธีที่เร็วกว่าสำหรับตารางใหญ่
-- สมมติ id เป็น Auto Increment ไม่มีช่องว่างมาก
SELECT * FROM DemoTable
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM DemoTable)))
ORDER BY id LIMIT 5;