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

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

วิธีง่ายที่สุดในการสุ่ม 1 แถวจากตาราง คือ ใช้ ORDER BY RAND() แล้วจำกัดด้วย LIMIT 1

ตัวอย่างการใช้งาน

สร้างตารางนักเรียนมี Primary Key Auto Increment:

mysql> create table DemoTable1581 (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName varchar(20)
    -> );
Query OK, 0 rows affected (1.34 sec)

เพิ่มข้อมูล 5 รายการ:

mysql> insert into DemoTable1581(StudentName) values('Chris');
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable1581(StudentName) values('Bob');
Query OK, 1 row affected (1.58 sec)
mysql> insert into DemoTable1581(StudentName) values('Sam');
Query OK, 1 row affected (2.11 sec)
mysql> insert into DemoTable1581(StudentName) values('Mike');
Query OK, 1 row affected (0.55 sec)
mysql> insert into DemoTable1581(StudentName) values('Carol');
Query OK, 1 row affected (0.16 sec)

ดูข้อมูลทั้งหมด:

mysql> select * from DemoTable1581;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Chris       |
|         2 | Bob         |
|         3 | Sam         |
|         4 | Mike        |
|         5 | Carol       |
+-----------+-------------+
5 rows in set (0.00 sec)

คิวรีสุ่ม 1 แถว

mysql> select * from DemoTable1581 order by rand() limit 1;

ผลลัพธ์ตัวอย่าง (สุ่มทุกครั้ง):

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         4 | Mike        |
+-----------+-------------+
1 row in set (0.07 sec)

คำอธิบายและข้อควรระวัง

  • RAND() สร้างค่าสุ่ม 0-1 สำหรับแต่ละแถว แล้วจัดเรียง
  • ประสิทธิภาพ: ตารางใหญ่ (>10K rows) จะช้ามาก เพราะต้องสร้างค่าสุ่มทุกแถวและ Sort
  • ทางเลือกสำหรับตารางใหญ่:
    • สุ่ม ID ในช่วง MIN-MAX แล้ว WHERE id >= random_id LIMIT 1
    • ใช้ Offset แบบสุ่ม: LIMIT 1 OFFSET FLOOR(RAND() * (SELECT COUNT(*) FROM table))