การสุ่มแถวข้อมูล (Random Row) ใน MySQL ด้วย PREPARE
วิธีหนึ่งในการสุ่มแถวเดียวจากตารางคือการคำนวณ OFFSET แบบสุ่ม แล้วใช้ PREPARE และ EXECUTE เพื่อรันคำสั่ง Dynamic SQL
สร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
FirstName VARCHAR(100),
CountryName VARCHAR(100)
);
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO DemoTable VALUES('Adam','US');
mysql> INSERT INTO DemoTable VALUES('Chris','AUS');
mysql> INSERT INTO DemoTable VALUES('Robert','UK');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+-----------+-------------+
| FirstName | CountryName |
+-----------+-------------+
| Adam | US |
| Chris | AUS |
| Robert | UK |
+-----------+-------------+
3 rows in set (0.00 sec)
ขั้นตอนการสุ่ม 1 แถว
mysql> SET @value := ROUND((SELECT COUNT(*) FROM DemoTable) * RAND());
Query OK, 0 rows affected (0.00 sec)
mysql> SET @query := CONCAT('SELECT * FROM DemoTable LIMIT ', @value, ', 1');
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE myStatement FROM @query;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE myStatement;
+-----------+-------------+
| FirstName | CountryName |
+-----------+-------------+
| Chris | AUS |
+-----------+-------------+
1 row in set (0.00 sec)
mysql> DEALLOCATE PREPARE myStatement;
Query OK, 0 rows affected (0.00 sec)
คำอธิบาย
RAND(): สุ่มเลข 0-1, คูณกับจำนวนแถว → ได้ OFFSET แบบสุ่มROUND(): ปัดเศษเป็นจำนวนเต็มCONCAT(): สร้างคำสั่ง SQL เป็นสตริงPREPARE ... EXECUTE ... DEALLOCATE: วงจรชีวิตของ Prepared Statement- วิธีนี้เหมาะสำหรับตารางขนาดเล็ก-กลาง สำหรับตารางใหญ่ควรใช้วิธีอื่น (เช่น ORDER BY RAND() LIMIT 1)