ใช้ Subquery: เรียงลำดับใหม่สุด 20 แถว ก่อน แล้วค่อยสุ่ม 5 แถวจากชุดนั้น
ตัวอย่างการใช้งาน
1. สร้างตารางและข้อมูล 29 แถว
mysql> CREATE TABLE DemoTable (ShippingDate DATETIME); -- INSERT 29 records from 2019-01-01 to 2019-05-18
2. Query: 20 แถวล่าสุด → สุ่ม 5 แถว
mysql> SELECT tbl1.* FROM (
-> SELECT * FROM DemoTable ORDER BY ShippingDate DESC LIMIT 20
-> ) AS tbl1
-> ORDER BY RAND() LIMIT 5;
ผลลัพธ์ตัวอย่าง (สุ่มทุกครั้ง)
+---------------------+ | ShippingDate | +---------------------+ | 2019-03-14 00:00:00 | | 2019-05-13 00:00:00 | | 2019-03-25 00:00:00 | | 2019-05-16 00:00:00 | | 2019-03-10 00:00:00 | +---------------------+
คำอธิบายขั้นตอน
- Subquery:
ORDER BY ShippingDate DESC LIMIT 20→ เอา 20 แถวล่าสุด - Outer query:
ORDER BY RAND() LIMIT 5→ สุ่ม 5 แถวจาก 20 แถวนั้น
ประสิทธิภาพ: หลีกเลี่ยง ORDER BY RAND() บนตารางใหญ่
วิธีที่ดีกว่า (Application Level)
-- 1. หา ID ของ 20 แถวล่าสุด SELECT Id FROM DemoTable ORDER BY ShippingDate DESC LIMIT 20; -- 2. ใน Application สุ่ม 5 ID จากรายการ -- 3. Query ดึงข้อมูล 5 ID นั้น SELECT * FROM DemoTable WHERE Id IN (id1, id2, id3, id4, id5);
MySQL 8.0: ใช้ CTE
WITH recent_20 AS (
SELECT * FROM DemoTable ORDER BY ShippingDate DESC LIMIT 20
)
SELECT * FROM recent_20 ORDER BY RAND() LIMIT 5;