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

MySQL สุ่มสุ่มข้อมูล 2 แถวด้วย ORDER BY RAND() LIMIT 2

ใช้ ORDER BY RAND() เพื่อสุ่มลำดับแถว แล้ว LIMIT 2 เพื่อจำกัดจำนวนแถวที่ต้องการ

ตัวอย่างการใช้งาน

1. สร้างตารางคำถาม

mysql> CREATE TABLE DemoTable1815 (
    Question TEXT
);
Query OK, 0 rows affected (0.00 sec)

2. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable1815 VALUES('What is your name?');
mysql> INSERT INTO DemoTable1815 VALUES('What is your college name?');
mysql> INSERT INTO DemoTable1815 VALUES('What is your nick name?');
mysql> INSERT INTO DemoTable1815 VALUES('What is your enemy name?');

3. แสดงข้อมูลทั้งหมด

mysql> SELECT * FROM DemoTable1815;
+----------------------------+
| Question                   |
+----------------------------+
| What is your name?         |
| What is your college name? |
| What is your nick name?    |
| What is your enemy name?   |
+----------------------------+

4. Query: สุ่ม 2 แถว

mysql> SELECT * FROM DemoTable1815 ORDER BY RAND() LIMIT 2;

5. ผลลัพธ์ (ตัวอย่าง - จะต่างไปทุกครั้ง)

+----------------------------+
| Question                   |
+----------------------------+
| What is your college name? |
| What is your enemy name?   |
+----------------------------+

⚠️ ประสิทธิภาพ: ORDER BY RAND() ช้าสำหรับตารางใหญ่

ORDER BY RAND() ต้องสร้างค่า Random ให้ทุกแถว แล้ว Sort ทั้งตาราง → O(N log N) ใช้ Filesort ไม่ใช้ Index

วิธีที่เร็วกว่าสำหรับตารางใหญ่ (Large Tables)

วิธี 1: ใช้ WHERE RAND() < Threshold (ประมาณการ)

SELECT * FROM DemoTable1815 
WHERE RAND() < (2 / (SELECT COUNT(*) FROM DemoTable1815))
LIMIT 2;

วิธี 2: ใช้ Primary Key + Random Offset (ต้องมี PK ติดต่อกัน)

SELECT * FROM DemoTable1815
WHERE Id >= (SELECT FLOOR(RAND() * (SELECT MAX(Id) FROM DemoTable1815)))
ORDER BY Id LIMIT 2;

วิธี 3: 2 Queries (Application Level)

-- Query 1: นับจำนวนทั้งหมด
SELECT COUNT(*) FROM DemoTable1815;  -- สมมติ = 10000

-- Application: สุ่ม 2 ตัวเลข Unique ระหว่าง 1-10000 (เช่น 123, 4567)

-- Query 2: ดึงโดย PK (Index Lookup เร็วมาก)
SELECT * FROM DemoTable1815 WHERE Id IN (123, 4567);

สรุป

ORDER BY RAND() LIMIT 2 ใช้ง่าย ใช้ได้กับตารางเล็ก (< 1000 แถว) สำหรับตารางใหญ่ ควรใช้วิธี Random Offset หรือ Application-level Random PK Lookup เพื่อประสิทธิภาพ