การสุ่มข้อมูลจากช่วงข้อมูลล่าสุด
ใช้ ORDER BY ... DESC LIMIT 20 เพื่อดึง 20 แถวล่าสุด แล้วค่อย ORDER BY RAND() LIMIT 5 เพื่อสุ่ม 5 แถว
ตัวอย่าง: ตาราง StudentId
mysql> create table DemoTable773 (StudentId int);
Query OK, 0 rows affected (0.59 sec)
แทรกข้อมูล 23 แถว (100, 200, 300, ..., 97)
คำสั่งสุ่ม 5 แถวจาก 20 แถวล่าสุด
mysql> select * from (
select * from DemoTable773 order by StudentId desc limit 20
) as RANDOM_OUTPUT order by rand() limit 5;
ผลลัพธ์ตัวอย่าง (จะต่างกันทุกครั้งที่รัน):
+-----------+
| StudentId |
+-----------+
| 95 |
| 4 |
| 10 |
| 7 |
| 300 |
+-----------+
คำอธิบายขั้นตอน
- Subquery:
select * from DemoTable773 order by StudentId desc limit 20- ดึง 20 แถวที่มี StudentId สูงสุด (ล่าสุด) - Outer query:
order by rand() limit 5- สุ่มลำดับแล้วเอา 5 แถวแรก
หมายเหตุประสิทธิภาพ
ORDER BY RAND()ช้าเมื่อข้อมูลเยอะ เพราะต้องสร้างค่าสุ่มทุกแถว- สำหรับตารางใหญ่ ควรใช้วิธีอื่น เช่นสุ่มค่า ID แล้ว JOIN
- Subquery ช่วยจำกัดขอบเขตก่อนสุ่ม ทำให้เร็วขึ้น
สรุป
รูปแบบ SELECT * FROM (SELECT ... ORDER BY id DESC LIMIT N) AS t ORDER BY RAND() LIMIT M เป็นวิธีมาตรฐานสำหรับสุ่ม M แถวจาก N แถวล่าสุด