วิธีง่ายที่สุดในการสุ่ม 1 แถวจากตาราง คือ ใช้ ORDER BY RAND() แล้วจำกัดด้วย LIMIT 1
ตัวอย่างการใช้งาน
สร้างตารางนักเรียนมี Primary Key Auto Increment:
mysql> create table DemoTable1581 (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20)
-> );
Query OK, 0 rows affected (1.34 sec)
เพิ่มข้อมูล 5 รายการ:
mysql> insert into DemoTable1581(StudentName) values('Chris');
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable1581(StudentName) values('Bob');
Query OK, 1 row affected (1.58 sec)
mysql> insert into DemoTable1581(StudentName) values('Sam');
Query OK, 1 row affected (2.11 sec)
mysql> insert into DemoTable1581(StudentName) values('Mike');
Query OK, 1 row affected (0.55 sec)
mysql> insert into DemoTable1581(StudentName) values('Carol');
Query OK, 1 row affected (0.16 sec)
ดูข้อมูลทั้งหมด:
mysql> select * from DemoTable1581;
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Chris | | 2 | Bob | | 3 | Sam | | 4 | Mike | | 5 | Carol | +-----------+-------------+ 5 rows in set (0.00 sec)
คิวรีสุ่ม 1 แถว
mysql> select * from DemoTable1581 order by rand() limit 1;
ผลลัพธ์ตัวอย่าง (สุ่มทุกครั้ง):
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 4 | Mike | +-----------+-------------+ 1 row in set (0.07 sec)
คำอธิบายและข้อควรระวัง
RAND()สร้างค่าสุ่ม 0-1 สำหรับแต่ละแถว แล้วจัดเรียง- ประสิทธิภาพ: ตารางใหญ่ (>10K rows) จะช้ามาก เพราะต้องสร้างค่าสุ่มทุกแถวและ Sort
- ทางเลือกสำหรับตารางใหญ่:
- สุ่ม ID ในช่วง MIN-MAX แล้ว WHERE id >= random_id LIMIT 1
- ใช้ Offset แบบสุ่ม:
LIMIT 1 OFFSET FLOOR(RAND() * (SELECT COUNT(*) FROM table))