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

สุ่มข้อมูลจากตาราง MySQL ด้วย RAND() และ LIMIT

ใช้ฟังก์ชัน RAND() ร่วมกับ ORDER BY และ LIMIT 1 เพื่อสุ่ม 1 แถว

ไวยากรณ์

SELECT * FROM yourTableName ORDER BY RAND() LIMIT 1;

สร้างตารางตัวอย่าง

mysql> CREATE TABLE selectRandomRecord (
    -> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName VARCHAR(20)
    -> );

เพิ่มข้อมูลตัวอย่าง (6 แถว)

mysql> INSERT INTO selectRandomRecord(StudentName) VALUES
('John'), ('Carol'), ('Bob'), ('Sam'), ('Mike'), ('Robert');

แสดงข้อมูลทั้งหมด

mysql> SELECT * FROM selectRandomRecord;

ผลลัพธ์:

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1         | John        |
| 2         | Carol       |
| 3         | Bob         |
| 4         | Sam         |
| 5         | Mike        |
| 6         | Robert      |
+-----------+-------------+

สุ่ม 1 แถว (รันครั้งแรก)

mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1;

ผลลัพธ์ตัวอย่าง:

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 3         | Bob         |
+-----------+-------------+

สุ่มอีกครั้ง (รันครั้งที่ 2)

mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1;

ผลลัพธ์ตัวอย่าง:

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 5         | Mike        |
+-----------+-------------+

ข้อควรระวังด้านประสิทธิภาพ

  • ORDER BY RAND() ต้องสร้างค่าสุ่มสำหรับ ทุกแถว แล้วค่อยเรียงลำดับ
  • ในตารางใหญ่ (หลายล้านแถว) จะช้ามาก

วิธีสุ่มที่เร็วกว่าสำหรับตารางใหญ่

-- วิธี 1: ใช้ OFFSET แบบสุ่ม (ต้องรู้จำนวนแถวทั้งหมดก่อน)
SELECT * FROM table_name
LIMIT 1 OFFSET FLOOR(RAND() * (SELECT COUNT(*) FROM table_name));

-- วิธี 2: ใช้ WHERE กับค่า RAND() (ถ้ามี PK แบบ sequential)
SELECT * FROM table_name
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table_name)))
ORDER BY id LIMIT 1;

สุ่มหลายแถว

SELECT * FROM table_name ORDER BY RAND() LIMIT 10;