การสุ่มเลือก 1 แถวจากตาราง MySQL ด้วย ORDER BY RAND() LIMIT 1
วิธีมาตรฐาน: เรียงลำดับแบบสุ่มด้วย RAND() แล้วจำกัด 1 แถวด้วย LIMIT 1
รูปแบบคำสั่ง
SELECT * FROM table_name ORDER BY RAND() LIMIT 1;
ตัวอย่าง: สุ่ม Quote จากตาราง
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(50),
Quote TEXT
);
INSERT INTO DemoTable (Name, Quote) VALUES
('Chris', 'MySQL is a relational database'),
('Robert', 'Java is an Object Oriented Programming Language'),
('Mike', 'C is a Procedural Language'),
('David', 'Hibernate and spring is a framework');
2. ดูข้อมูลทั้งหมด
SELECT * FROM DemoTable;
ผลลัพธ์: 4 แถว
3. สุ่ม 1 แถว
SELECT Id, Name, Quote FROM DemoTable ORDER BY RAND() LIMIT 1;
ผลลัพธ์ตัวอย่าง:
+----+------+----------------------------+
| Id | Name | Quote |
+----+------+----------------------------+
| 3 | Mike | C is a Procedural Language |
+----+------+----------------------------+
ข้อควรระวังด้านประสิทธิภาพ (สำคัญมาก)
ORDER BY RAND()ต้องสร้างค่าสุ่มให้ **ทุกแถว** ในตาราง → Full Table Scan + Sort- ตาราง 10,000+ แถว จะช้ามาก
- ตาราง 1,000,000+ แถว อาจ Timeout
วิธีสุ่มที่เร็วกว่า (สำหรับตารางใหญ่)
วิธี 1: ใช้ ID สุ่ม (ต้องมี AUTO_INCREMENT ไม่มี Gap มาก)
SELECT * FROM DemoTable
WHERE Id >= (SELECT FLOOR(RAND() * (SELECT MAX(Id) FROM DemoTable)))
ORDER BY Id LIMIT 1;
วิธี 2: ใช้ OFFSET แบบสุ่ม (ต้องรู้ COUNT ก่อน)
SELECT COUNT(*) INTO @total FROM DemoTable;
SET @offset = FLOOR(RAND() * @total);
PREPARE stmt FROM 'SELECT * FROM DemoTable LIMIT 1 OFFSET ?';
EXECUTE stmt USING @offset;
วิธี 3: ใช้ TABLESAMPLE (MySQL 8.0.31+ - Bernoulli/System Sampling)
SELECT * FROM DemoTable TABLESAMPLE SYSTEM (1) LIMIT 1;
การสุ่มหลายแถว (N Rows)
SELECT * FROM DemoTable ORDER BY RAND() LIMIT 5;
การสุ่มแบบ Reproducible (Seed)
SELECT * FROM DemoTable ORDER BY RAND(12345) LIMIT 1;
Seed เดียว = ลำดับสุ่มเดียวกัน (สำหรับ Testing/Debugging)