ใช้ 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 เพื่อประสิทธิภาพ