Chào các bạn, ở bài viết hôm nay mình sẽ cùng các bạn đi giải quyết một bài toán khá đơn giản bằng các cách khác nhau sử dụng kiến thức truy vấn cơ sở dữ liệu với hệ quản trị cơ sở dữ liệu MySQL.
Đặt vấn đề
Mình có table customers chứa thông tin khách hàng bao gồm 3 trường custID, custFirst và custLast, table sales chứa thông tin về lịch sử bán hàng gồm các trường saleID, dateSale, saleAmount và custID. Quan hệ giữa customers và sales là 1 - n.
Bài toán đặt ra là giờ mình muốn lấy danh sách các customers và lịch sử bán hàng gần nhất cho customer đó.
Các bạn có thể chạy lệnh sql bên dưới để tạo cấu trúc các table và sample data.
1 | CREATE TABLE `customers` ( |
Sample data table customers.
1 | +--------+-----------+-----------+ |
Sample data table sales.
1 | +--------+---------------------+------------+--------+ |
Giải pháp
Đầu tiên mình sẽ tạo ra bảng tạm, mục đích của bảng này là lấy ra những record sales gần nhất ứng với mỗi custID trong bảng sales.
Mình sử dụng câu lệnh sql sau:
1 | SELECT s1.* |
Kết quả sẽ như sau:
1 | +--------+---------------------+------------+--------+ |
Bây giờ mình sẽ join với bảng customers thông qua custID là xong.
1 |
|
Kết quả:
1 | +--------+-----------+-----------+--------+---------------------+------------+--------+ |
Như kết quả trả về trên thì hai khách hàng John và Winston có lịch sử mua hàng gần nhất còn khách hàng Sally thì chưa mua lần nào.
Có một cách khác để giải quyết bài toán này. Mình viết lại câu truy vấn như sau:
1 | SELECT c.*, s1.* |
Kết quả cũng tương tự như cách trên.
Tuy nhiên, sẽ có lúc gặp trường hợp một customer có nhiều hơn một bản ghi sales gần nhất. Để giải quyết vấn đề này các bạn có thể dùng limit.
Kết luận
Hi vọng bài viết sẽ hữu ích cho các bạn, cảm ơn đã đọc (bow).