MySQL - Chọn các bản ghi ngẫu nhiên

Giới thiệu

Xin chào các nhà法师数据库 tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của MySQL và học cách chọn các bản ghi ngẫu nhiên. Là người hướng dẫn tin cậy với nhiều năm kinh nghiệm giảng dạy, tôi hứa sẽ làm cho chuyến phiêu lưu này vừa vui vẻ vừa bổ ích. Hãy thắt dây an toàn và cùng nhau lặn sâu vào!

MySQL - Select Random Records

Chọn các bản ghi ngẫu nhiên trong MySQL

Bạn có bao giờ tự hỏi làm thế nào các trang web hiển thị các trích dẫn hoặc sự thật ngẫu nhiên không? Hay làm thế nào các trò chơi trực tuyến chọn ngẫu nhiên người chơi cho các trận đấu? Đúng vậy, những phép màu thường xảy ra trong cơ sở dữ liệu, và MySQL cung cấp cho chúng ta những công cụ mạnh mẽ để đạt được sự ngẫu nhiên này.

Chọn các bản ghi ngẫu nhiên là một nhiệm vụ phổ biến trong quản lý cơ sở dữ liệu, và nó đặc biệt hữu ích khi bạn muốn:

  • Hiển thị nội dung ngẫu nhiên cho người dùng
  • Tạo bộ dữ liệu mẫu cho thử nghiệm
  • Thực hiện việc chọn ngẫu nhiên trong các trò chơi hoặc bài kiểm tra

Hãy bắt đầu từ cơ bản và dần dần nâng cao kỹ thuật.

Hàm RAND() của MySQL

Trái tim của hành trình chọn ngẫu nhiên của chúng ta là hàm RAND() của MySQL. Hàm nhỏ bé này tạo ra một giá trị số nổi phao ngẫu nhiên介于 0 và 1.

Dưới đây là một ví dụ đơn giản:

SELECT RAND();

Nếu bạn chạy truy vấn này nhiều lần, bạn sẽ nhận được kết quả khác nhau mỗi lần, như:

0.123456789
0.987654321
0.555555555

Bây giờ, hãy xem chúng ta có thể sử dụng RAND() để chọn các bản ghi ngẫu nhiên từ một bảng. Hãy tưởng tượng chúng ta có một bảng叫做 famous_quotes với các cột id, author, và quote.

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

Truy vấn này thực hiện các bước sau:

  1. Chọn tất cả các cột từ bảng famous_quotes
  2. Sắp xếp kết quả ngẫu nhiên sử dụng ORDER BY RAND()
  3. Giới hạn đầu ra chỉ còn một bản ghi với LIMIT 1

Kết quả có thể trông như thế này:

| id | author           | quote                                        |
|----|------------------|----------------------------------------------|
| 42 | Douglas Adams    | Đừng lo lắng!                                 |

Mỗi lần bạn chạy truy vấn này, bạn sẽ nhận được một trích dẫn ngẫu nhiên khác nhau. Thật tuyệt vời phải không?

Sử dụng LIMIT với hàm RAND()

Vậy nếu chúng ta muốn nhiều hơn một bản ghi ngẫu nhiên? Đơn giản thôi! Chúng ta chỉ cần điều chỉnh câu lệnh LIMIT. Hãy lấy 3 trích dẫn ngẫu nhiên:

SELECT * FROM famous_quotes ORDER BY RAND() LIMIT 3;

Điều này có thể cho chúng ta:

| id | author           | quote                                        |
|----|------------------|----------------------------------------------|
| 17 | Oscar Wilde      | Hãy là chính mình; người khác đã có rồi. |
| 53 | Mark Twain       | Bí mật để tiến lên là bắt đầu. |
| 8  | Albert Einstein  | Sáng tạo quan trọng hơn kiến thức. |

Nhớ rằng, mỗi lần bạn chạy truy vấn này, bạn sẽ nhận được một bộ 3 trích dẫn ngẫu nhiên khác nhau. Nó giống như một cuộc vui đùa ngẫu nhiên trong cơ sở dữ liệu!

Lời cảnh báo

Mặc dù ORDER BY RAND() đơn giản và hiệu quả,但它可以在大型表上变得很慢。这是因为MySQL必须为每一行生成一个随机数,然后 sắp xếp tất cả các số này. Đối với các bảng nhỏ đến trung bình, nó hoàn toàn ổn, nhưng đối với các bộ dữ liệu lớn hơn, chúng ta có thể cần các phương pháp tối ưu hơn.

Chọn các bản ghi ngẫu nhiên bằng chương trình client

Đôi khi, việc chọn các bản ghi ngẫu nhiên bằng ngôn ngữ lập trình phía client hiệu quả hơn. Dưới đây là cách bạn có thể làm điều đó trong một vài ngôn ngữ lập trình khác nhau:

Python

import mysql.connector
import random

# Kết nối với cơ sở dữ liệu
cnx = mysql.connector.connect(user='your_username', password='your_password',
host='127.0.0.1', database='your_database')
cursor = cnx.cursor()

# Lấy tổng số bản ghi
cursor.execute("SELECT COUNT(*) FROM famous_quotes")
total_records = cursor.fetchone()[0]

# Tạo một vị trí ngẫu nhiên
random_offset = random.randint(0, total_records - 1)

# Lấy một bản ghi ngẫu nhiên
cursor.execute(f"SELECT * FROM famous_quotes LIMIT 1 OFFSET {random_offset}")
random_quote = cursor.fetchone()

print(random_quote)

# Đóng kết nối
cnx.close()

PHP

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);

// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}

// Lấy tổng số bản ghi
$sql = "SELECT COUNT(*) as total FROM famous_quotes";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$total_records = $row['total'];

// Tạo vị trí ngẫu nhiên
$random_offset = rand(0, $total_records - 1);

// Lấy bản ghi ngẫu nhiên
$sql = "SELECT * FROM famous_quotes LIMIT 1 OFFSET $random_offset";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
echo "ID: " . $row["id"]. " - Tác giả: " . $row["author"]. " - Trích dẫn: " . $row["quote"];
} else {
echo "0 kết quả";
}

$conn->close();
?>

Trong cả hai ví dụ này, chúng ta:

  1. Kết nối với cơ sở dữ liệu
  2. Lấy tổng số bản ghi
  3. Tạo một vị trí ngẫu nhiên
  4. Sử dụng LIMIT 1 OFFSET [số ngẫu nhiên] để lấy một bản ghi ngẫu nhiên

Phương pháp này hiệu quả hơn cho các bảng lớn vì nó không yêu cầu sắp xếp toàn bộ bảng.

Kết luận

Và thế là bạn đã có, các bạn học sinh ham học! Chúng ta đã khám phá nhiều cách để chọn các bản ghi ngẫu nhiên trong MySQL, từ phương pháp đơn giản ORDER BY RAND() đến các kỹ thuật phía client phức tạp hơn. Nhớ rằng, phương pháp tốt nhất phụ thuộc vào trường hợp sử dụng cụ thể và kích thước bộ dữ liệu của bạn.

Khi kết thúc, hãy để lại một chút hài hước về cơ sở dữ liệu: Tại sao cơ sở dữ liệu lại đi gặp bác sĩ tâm lý? Nó có quá nhiều vấn đề quan hệ! ?

Hãy tiếp tục thực hành, 保持好奇心, và sớm bạn sẽ trở thành chuyên gia trong việc收回随机记录在你编程圈子里。下次见,快乐查询!

Phương pháp Ưu điểm Nhược điểm Phù hợp cho
ORDER BY RAND() Đơn giản, dễ sử dụng Có thể chậm trên các bảng lớn Bảng nhỏ đến trung bình
Chọn ngẫu nhiên bằng phía client Hiệu quả hơn cho các bảng lớn Yêu cầu nhiều mã hơn Bảng lớn
OFFSET với số ngẫu nhiên Hiệu quả, hoạt động tốt với phân trang Cần biết tổng số bản ghi Bảng trung bình đến lớn
Cột được chỉ định với giá trị ngẫu nhiên Rất nhanh cho việc chọn ngẫu nhiên thường xuyên Cần cột bổ sung và bảo trì Chọn ngẫu nhiên thường xuyên trên các bảng lớn

Credits: Image by storyset