การสุ่มเลือก 1 แถว (Random Row) จากตาราง MySQL
ใช้ ORDER BY RAND() จับคู่แถวกับค่าสุ่ม แล้ว LIMIT 1 เอาแค่แถวแรก
Syntax
SELECT * FROM table_name ORDER BY RAND() LIMIT 1;
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูล:
mysql> CREATE TABLE DemoTable735 (Amount INT); Query OK, 0 rows affected (0.57 sec) mysql> INSERT INTO DemoTable735 VALUES (984474734), (489393323), (23432333), (8949933); Query OK, 4 rows affected
ข้อมูลทั้งหมด:
mysql> SELECT * FROM DemoTable735;
+-----------+ | Amount | +-----------+ | 984474734 | | 489393323 | | 23432333 | | 8949933 | +-----------+ 4 rows in set (0.00 sec)
สุ่มเลือก 1 แถว:
mysql> SELECT * FROM DemoTable735 ORDER BY RAND() LIMIT 1;
+-----------+ | Amount | +-----------+ | 489393323 | -- ผลลัพธ์สุ่ม (รันซ้ำจะได้คนละแถว) +-----------+ 1 row in set (0.00 sec)
ประสิทธิภาพและข้อจำกัด
- ช้าสำหรับตารางใหญ่ - ต้องสร้าง Temp Table + Sort ทุกแถว (O(N log N))
- ไม่ใช้ Index ได้
- ตาราง > 10,000 แถว ควรใช้วิธีอื่น
วิธีเร็วกว่าสำหรับตารางใหญ่ (มี Auto Increment ID)
-- 1. หา Max ID SELECT MAX(id) INTO @max_id FROM large_table; -- 2. สุ่ม ID ในช่วง SET @random_id = FLOOR(RAND() * @max_id) + 1; -- 3. หาแถวที่ ID >= Random ID (Limit 1) SELECT * FROM large_table WHERE id >= @random_id ORDER BY id LIMIT 1;
วิธีอื่น: TABLESAMPLE (MySQL 8.0.31+)
SELECT * FROM large_table TABLESAMPLE SYSTEM (10) LIMIT 1;
Bernoulli Sampling (ประมาณ 10% ของแถว) เร็วมาก แต่ไม่ได้ Uniform Random แบบถูกต้อง
สุ่มหลายแถว (N Rows)
SELECT * FROM table_name ORDER BY RAND() LIMIT 10;