Tác giả: Lê Trung Kiên lớp java 08
Email: lekien.2803.cg@gmail.com
SĐT: 0942096947
Link bài toán: https://leetcode.com/problems/customers-who-never-order/

1. Mở đầu

Xin chào các bạn, mình viết ra bài viết này để chia sẻ phương pháp giải cũng như tư duy của mình về bài toán này của leetcode. Phương pháp của mình có thể không phải là tối ưu nhất, tuy nhiên mình sẽ phân tích, chia nhỏ bài toán ra thành các module nhỏ hơn để dễ giải quyết cũng như giúp các bạn hiểu được các yêu cầu mà bài toán đưa ra.

2. Đề bài

Cho bảng Customers:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
id là khóa chính của bảng.
Mỗi hàng của bảng này cho biết ID và tên của một khách hàng.

Cho bảng Orders:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| customerId  | int  |
+-------------+------+
id là khóa chính của bảng.
customerId là khóa ngoại từ bảng Customers.
Mỗi hàng của bảng này cho biết ID của đơn đặt hàng và ID của khách hàng đã đặt hàng.

Hãy viết câu truy vấn lấy ra danh sách khách hàng chưa bao giờ đặt hàng.
Trả về bảng kết quả theo thứ tự bất kỳ.
Định dạng kết quả truy vấn nằm trong ví dụ sau.

Ví dụ 1:

Input: 
Customers table:
+----+-------+
| id | name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+
Orders table:
+----+------------+
| id | customerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+
Output: 
+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

3. Phân tích

Nhìn vào ví dụ chúng ta có thể thấy, bảng kết quả trả về sẽ là name trong bảng Customers, tuy nhiên thì cần phải lọc ra những khách hàng chưa đặt hàng bao giờ.
Sử dụng truy vấn phụ và mệnh đề NOT IN
Với cách này, chúng ta đã biết khách hàng nào đã đặt hàng, thì việc tìm ra khách chưa đặt hàng cũng dễ như vậy. Bằng câu lệnh sau thì chúng ta sẽ lấy được tất cả id của khách nào đã đặt hàng:

select customerid from orders;

Câu truy vấn trên trả về kết quả như sau:

| customerid |
| ---------- |
| 3          |
| 1          |

Chúng ta đã có id của những khách đã đặt hàng, vậy thì chỉ cần lựa ra từ bảng Customers những khách không có id trong bảng này là được.
Done! Chúng ta sang bước tiếp theo nhé.

4. Code luôn cho nóng

Code của chúng ta sẽ như sau:

select customers.name as 'Customers'
from customers
where customers.id not in
(
    select customerid from orders
);

5. Kết thúc

Qua bài viết này, mình đã chia sẻ cho các bạn cách mình tư duy khi giải bài tập trên leetcode. Hi vọng bài viết giúp ích cho các bạn trong cách tư duy để giải các bài tập khác. Xin cám ơn các bạn đã dành thời gian đọc và theo dõi. Peace!!!