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/duplicate-emails/

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 Person:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id là cột khóa chính cho bảng này.
Mỗi hàng của bảng này chứa một email. Các email sẽ không chứa chữ in hoa.

Viết một truy vấn SQL để báo cáo tất cả các email trùng lặp. Xin đảm bảo rằng trường email không phải là NULL.
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ụ:

Input: 
Person table:
+----+---------+
| id | email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+
Output: 
+---------+
| Email   |
+---------+
| a@b.com |
+---------+
Explanation: a@b.com is repeated two times.

3. Phân tích

Ô kê, bài này họ yêu cầu chúng ta tìm ra email bị trùng lặp, tức là số lần xuất hiện của email đó từ hai lần trở lên. Chúng ta sẽ sử dụng mệnh đề GROUP BY cùng với SELECT để sắp xếp dữ liệu giống nhau thành các nhóm. Tuy nhiên nếu chỉ dùng hai mệnh đề như vậy thì chúng ta sẽ có kết quả là:

| Email   |
| ------- |
| a@b.com |
| c@d.com |

Tại vì GROUP BY chỉ sắp xếp các dữ liệu giống nhau thành các nhóm không trùng lặp.
Công việc của chúng ta sẽ phải làm là đếm số email giống nhau, nếu cái email nào có số lượng từ 2 trở lên, thì ta mới dùng đến GROUP BY để nhóm chúng lại.
Để có thể đếm được số lượng bản ghi giống nhau thì ta dùng hàm COUNT(). Kết hợp với đó là mệnh đề HAVING để có thể chọn ra được những email có bản trùng lặp.

4. Code bằng máy

Code của chúng ta có dạng như sau:

select Email
from Person
group by Email
having count(Email) > 1

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!!!