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

สุ่มเลือกแถวข้อมูลจากตาราง MySQL ด้วย ORDER BY RAND() LIMIT 1

การสุ่มเลือก 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;