Phương pháp
Sử dụng ORDER BY RAND() kết hợp LIMIT để lấy mẫu ngẫu nhiên, sau đó gom nhóm bằng GROUP_CONCAT.
Ví dụ hoàn chỉnh
Tạo bảng và chèn dữ liệu:
CREATE TABLE DemoTable (Value INT);
INSERT INTO DemoTable VALUES
(89), (98), (10), (78), (75), (76), (74), (99), (101);
Tạo Stored Procedure:
DELIMITER //
CREATE PROCEDURE generate_Random5Numbers()
BEGIN
SELECT GROUP_CONCAT(Value SEPARATOR '/')
FROM (
SELECT Value
FROM (
SELECT Value
FROM DemoTable
WHERE Value BETWEEN 10 AND 100
ORDER BY RAND()
LIMIT 5
) AS Ascending_Order
ORDER BY Value
) AS FiveValues;
END //
DELIMITER ;
Gọi procedure:
CALL generate_Random5Numbers();
Kết quả mẫu:
+-----------------------------------+
| GROUP_CONCAT(Value SEPARATOR '/') |
+-----------------------------------+
| 89/74/78/99/10 |
+-----------------------------------+
Giải thích các bước
- Lọc phạm vi:
WHERE Value BETWEEN 10 AND 100chỉ lấy giá trị trong khoảng. - Ngẫu nhiên hóa:
ORDER BY RAND()sắp xếp ngẫu nhiên. - Giới hạn:
LIMIT 5lấy 5 bản ghi đầu tiên. - Sắp xếp lại: Subquery ngoài sắp xếp theo giá trị tăng dần.
- Gom chuỗi:
GROUP_CONCAT(... SEPARATOR '/')nối thành chuỗi.
Lưu ý hiệu năng
ORDER BY RAND()chậm trên bảng lớn (full table scan + filesort).- Với bảng lớn, hãy dùng kỹ thuật
WHERE RAND() < (SELECT (5/COUNT(*)) FROM DemoTable)hoặc lấy ID ngẫu nhiên từ ứng dụng. GROUP_CONCATcó giới hạn độ dài mặc định 1024 bytes (cấu hìnhgroup_concat_max_len).