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

สุ่ม 5 แถวจาก 50 แถวล่าสุดใน MySQL

การเตรียมข้อมูล

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 |
+--------+

การทำงานแบบขั้นตอน

  1. Subquery: เรียง DESC ตาม UserId (ID มาก = ใหม่กว่า) แล้ว LIMIT 50 → ได้ 50 แถวล่าสุด
  2. 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
);