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

MySQL: สุ่มข้อมูล 5 แถวจาก 20 แถวล่าสุด

การสุ่มข้อมูลจากช่วงข้อมูลล่าสุด

ใช้ 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       |
+-----------+

คำอธิบายขั้นตอน

  1. Subquery: select * from DemoTable773 order by StudentId desc limit 20 - ดึง 20 แถวที่มี StudentId สูงสุด (ล่าสุด)
  2. 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 แถวล่าสุด