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

วิธีสุ่มแสดง 1 แถวจากตาราง MySQL ด้วย RAND() และ LIMIT 1

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

วิธีมาตรฐาน: เรียงลำดับแบบสุ่มด้วย RAND() แล้วจำกัด 1 แถวด้วย LIMIT 1

รูปแบบคำสั่ง

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

ตัวอย่าง: สุ่ม Quote จากตาราง

1. สร้างตารางและเพิ่มข้อมูล

CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(50),
    Quote TEXT
);

INSERT INTO DemoTable (Name, Quote) VALUES 
('Chris', 'MySQL is a relational database'),
('Robert', 'Java is an Object Oriented Programming Language'),
('Mike', 'C is a Procedural Language'),
('David', 'Hibernate and spring is a framework');

2. ดูข้อมูลทั้งหมด

SELECT * FROM DemoTable;

ผลลัพธ์: 4 แถว

3. สุ่ม 1 แถว

SELECT Id, Name, Quote FROM DemoTable ORDER BY RAND() LIMIT 1;

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

+----+------+----------------------------+
| Id | Name | Quote                      |
+----+------+----------------------------+
| 3  | Mike | C is a Procedural Language |
+----+------+----------------------------+

ข้อควรระวังด้านประสิทธิภาพ (สำคัญมาก)

  • ORDER BY RAND() ต้องสร้างค่าสุ่มให้ **ทุกแถว** ในตาราง → Full Table Scan + Sort
  • ตาราง 10,000+ แถว จะช้ามาก
  • ตาราง 1,000,000+ แถว อาจ Timeout

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

วิธี 1: ใช้ ID สุ่ม (ต้องมี AUTO_INCREMENT ไม่มี Gap มาก)

SELECT * FROM DemoTable 
WHERE Id >= (SELECT FLOOR(RAND() * (SELECT MAX(Id) FROM DemoTable))) 
ORDER BY Id LIMIT 1;

วิธี 2: ใช้ OFFSET แบบสุ่ม (ต้องรู้ COUNT ก่อน)

SELECT COUNT(*) INTO @total FROM DemoTable;
SET @offset = FLOOR(RAND() * @total);
PREPARE stmt FROM 'SELECT * FROM DemoTable LIMIT 1 OFFSET ?';
EXECUTE stmt USING @offset;

วิธี 3: ใช้ TABLESAMPLE (MySQL 8.0.31+ - Bernoulli/System Sampling)

SELECT * FROM DemoTable TABLESAMPLE SYSTEM (1) LIMIT 1;

การสุ่มหลายแถว (N Rows)

SELECT * FROM DemoTable ORDER BY RAND() LIMIT 5;

การสุ่มแบบ Reproducible (Seed)

SELECT * FROM DemoTable ORDER BY RAND(12345) LIMIT 1;

Seed เดียว = ลำดับสุ่มเดียวกัน (สำหรับ Testing/Debugging)