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

สุ่มข้อมูลจากตารางใน MySQL ด้วย PREPARE STATEMENT

การสุ่มแถวข้อมูล (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)