ใช้ฟังก์ชัน RAND() ร่วมกับ ORDER BY และ LIMIT 1 เพื่อสุ่ม 1 แถว
ไวยากรณ์
SELECT * FROM yourTableName ORDER BY RAND() LIMIT 1;
สร้างตารางตัวอย่าง
mysql> CREATE TABLE selectRandomRecord (
-> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName VARCHAR(20)
-> );
เพิ่มข้อมูลตัวอย่าง (6 แถว)
mysql> INSERT INTO selectRandomRecord(StudentName) VALUES
('John'), ('Carol'), ('Bob'), ('Sam'), ('Mike'), ('Robert');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM selectRandomRecord;
ผลลัพธ์:
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | John | | 2 | Carol | | 3 | Bob | | 4 | Sam | | 5 | Mike | | 6 | Robert | +-----------+-------------+
สุ่ม 1 แถว (รันครั้งแรก)
mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1;
ผลลัพธ์ตัวอย่าง:
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 3 | Bob | +-----------+-------------+
สุ่มอีกครั้ง (รันครั้งที่ 2)
mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1;
ผลลัพธ์ตัวอย่าง:
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 5 | Mike | +-----------+-------------+
ข้อควรระวังด้านประสิทธิภาพ
ORDER BY RAND()ต้องสร้างค่าสุ่มสำหรับ ทุกแถว แล้วค่อยเรียงลำดับ- ในตารางใหญ่ (หลายล้านแถว) จะช้ามาก
วิธีสุ่มที่เร็วกว่าสำหรับตารางใหญ่
-- วิธี 1: ใช้ OFFSET แบบสุ่ม (ต้องรู้จำนวนแถวทั้งหมดก่อน) SELECT * FROM table_name LIMIT 1 OFFSET FLOOR(RAND() * (SELECT COUNT(*) FROM table_name)); -- วิธี 2: ใช้ WHERE กับค่า RAND() (ถ้ามี PK แบบ sequential) SELECT * FROM table_name WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table_name))) ORDER BY id LIMIT 1;
สุ่มหลายแถว
SELECT * FROM table_name ORDER BY RAND() LIMIT 10;