Trong bài viết này mình sẽ hướng dẫn cách lấy dữ liệu ngâu nhiên trong MySQL, đây là chức năng thường gặp khi bạn xây dựng các ứng dụng Website có sử dụng MySQL. Điển hình như:
- Hiển thị bài ngẫu nhiên bên Sidebar
- Hiển thị bài ngẫu nhiên liên quan đến bài viết
Mục lục
- 1. Lấy record ngẫu nhiên bằng ORDER BY RAND()
- 2. Lấy record ngẫu nhiên bằng lệnh JOIN
- 3. Lấy record ngẫu nhiên bằng JOIN và tạo biến
1. Lấy record ngẫu nhiên bằng ORDER BY RAND()
MySQL không tích hợp bất kỳ câu lệnh nào để chọn các record ngẫu nhiên từ một bảng. Để thực hiện điều này ta bạn sử dụng hàm RAND ().
Truy vấn sau đây chọn một hàng ngẫu nhiên trong một table bất kì:
1 2 3 | SELECT * FROM table_name ORDER BY RAND() LIMIT 1; |
Giải thích:
Bài viết này được đăng tại [tranvanbinh.vn]
- Hàm RAND() sẽ sinh ra giá trị ngẫu nhiên cho từng record trả về.
- Lệnh ORDER BY sẽ sắp xếp các records theo giá trị mà hàn RAND sinh ra
- LIMIT là giới hạn số record mà bạn sẽ lấy.
Nếu bạn muốn chọn N bản ghi ngẫu nhiên từ bảng cơ sở dữ liệu, bạn cần thay đổi mệnh đề LIMIT như sau:
1 2 3 | SELECT * FROM table_name ORDER BY RAND() LIMIT N; |
Giả sử ta có table như sau:
Và câu SQL dưới đây sẽ lấy record ngẫu nhiên từ bảng này.
1 2 3 4 5 6 7 | SELECT customerNumber, customerName FROM customers ORDER BY RAND() LIMIT 5; |
Lưu ý rằng khi bạn chạy lệnh này thì mỗi lần chạy kêt quả sẽ khác nhau, bởi giá trị mà hàm RAND sinh ra là ngẫu nhiên.
Kỹ thuật này hoạt động rất tốt với table nhỏ. Tuy nhiên, nó sẽ chậm đối với table lớn vì MySQL phải sắp xếp toàn bộ dữ liệu để chọn ngẫu nhiên.
Tốc độ của truy vấn cũng phụ thuộc vào số hàng trong bảng. Bảng càng có nhiều hàng, thì càng mất nhiều thời gian để tạo số ngẫu nhiên cho mỗi hàng.
- => Nói chung là không tối ưu, không nên sử dụng
2. Lấy record ngẫu nhiên bằng lệnh JOIN
Kỹ thuật này yêu cầu bảng phải có khóa chính tăng tự động (auto increment) và không có khoảng trống trong dãy thứ tự tăng dần. Tức là tăng dần 1, 2 ,3 thì ok, còn bị khuyết một giá trị như 1, 2, 5 ,6 thì không được.
Truy vấn sau tạo một số ngẫu nhiên dựa trên cột khóa chính:
1 2 | SELECT ROUND(RAND() * ( SELECT MAX (id) FROM table_name)) AS id; |
Chúng ta có thể JOIN table với kết quả này để lấy record ngẫu nhiên.
1 2 3 4 5 6 7 8 9 10 | SELECT t.* FROM table_name AS t INNER JOIN ( SELECT ROUND( RAND() * ( SELECT MAX (id) FROM table_NAME )) AS id ) AS x WHERE t.id >= x.id LIMIT 1; |
Sử dụng kỹ thuật này bạn phải thực hiện truy vấn nhiều lần nếu muốn lấy nhiều record ngẫu nhiên, bởi vì câu lệnh sub query chỉ trả về một giá trị random mà thôi.
Truy vấn sau đây trả về một khách hàng ngẫu nhiên từ bảng customer
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SELECT t.customerNumber, t.customerName FROM customers AS t JOIN ( SELECT ROUND(RAND() * ( SELECT MAX (customerNumber) FROM customers)) AS customerNumber ) AS x WHERE t.customerNumber >= x.customerNumber LIMIT 1; |
3. Lấy record ngẫu nhiên bằng JOIN và tạo biến
Trong trường hợp bảng có cột khóa chính id
với các giá trị nằm trong phạm vi 1..N, bạn có thể sử dụng kỹ thuật sau:
- Đầu tiên, chọn các số ngẫu nhiên trong phạm vi 1..N.
- Thứ hai, chọn các bản ghi dựa trên các số ngẫu nhiên.
- Câu lệnh sau giúp bạn thực hiện điều này:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SELECT table . * FROM ( SELECT ROUND(RAND() * ( SELECT MAX (id) FROM table )) random_num, @num:=@num + 1 FROM ( SELECT @num:=0) AS a, table LIMIT N) AS b, table AS t WHERE b.random_num = t.id; |
Trên là ba cách đơn giản nhất để lấy record ngẫu nhiên trong MySQL. Bạn có thể áp dụng để đưa vào dự án của mình.
Trong ba cách đó thì bạn không nên sử dụng cách 1 nhé, nó sẽ không tốt nếu dữ liệu quá lớn.
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty