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

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

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

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

  1. Subquery: ORDER BY ShippingDate DESC LIMIT 20 → เอา 20 แถวล่าสุด
  2. 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;