การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1853 (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
-- Insert 58 แถว
mysql> INSERT INTO DemoTable1853 VALUES(),(),()... (58 rows);
Query: สุ่ม 5 แถวจาก 50 แถวล่าสุด
mysql> SELECT tbl.* FROM (
SELECT tbl1.* FROM DemoTable1853 tbl1
ORDER BY UserId DESC
LIMIT 50
) tbl
ORDER BY RAND()
LIMIT 5;
ผลลัพธ์ (สุ่ม):
+--------+
| UserId |
+--------+
| 19 |
| 24 |
| 43 |
| 36 |
| 48 |
+--------+
การทำงานแบบขั้นตอน
- Subquery: เรียง DESC ตาม UserId (ID มาก = ใหม่กว่า) แล้ว LIMIT 50 → ได้ 50 แถวล่าสุด
- Outer Query: สุ่มลำดับด้วย
ORDER BY RAND()แล้ว LIMIT 5
ข้อควรระวังเรื่องประสิทธิภาพ
ORDER BY RAND()ต้องสร้าง Temporary Table และ Sort ทุกแถว- Subquery LIMIT 50 ช่วยจำกัดขนาดก่อนสุ่ม
- สำหรับตารางใหญ่มาก ควรสุ่ม ID แล้ว JOIN
วิธี Alternative (เร็วกว่าสำหรับตารางใหญ่)
-- 1. หา Max ID
SELECT MAX(UserId) INTO @max_id FROM DemoTable1853;
-- 2. สุ่ม 5 ID ในช่วง
SELECT * FROM DemoTable1853
WHERE UserId >= @max_id - 50
AND UserId <= @max_id
AND UserId IN (
SELECT FLOOR(RAND() * 50) + (@max_id - 50)
FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t
);