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

สร้าง Stored Procedure สุ่มเลข 5 ตัวใน MySQL

การสุ่มข้อมูลด้วย 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 ;

อธิบายโครงสร้าง

  1. WHERE Value BETWEEN 10 AND 100 - กรองช่วงค่าที่ต้องการสุ่ม
  2. ORDER BY RAND() - สลับลำดับแถวแบบสุ่ม
  3. LIMIT 5 - เอาแค่ 5 แถวแรกหลังสุ่ม
  4. Subquery Ascending_Order - เรียงค่าที่สุ่มได้จากน้อยไปมาก
  5. 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;