Hôm nay tôi muốn đi sâu vào function FIND_IN_SET của MYSQL để giải quyết các vấn đề về tìm kiếm trong 1 tập hợp bằng câu Query mà không cần can thiệp bởi ngôn ngữ khác.
Lưu ý rằng: function find_in_set hoạt động với cả kiểu số và kiểu chuỗi. Và cách hoạt động khác với function in() của MySQL.
1. Data table
Tôi có 1 table department như sau:
id | dept_name | userid | username |
---|---|---|---|
1 | Finance | 1,2,4,5 | yssyogesh,sonarika,anil,amit |
2 | IT | 1,5 | yssyogesh,amit |
3 | Marketing | 2,3 | sonarika,mayank |
4 | Operational | 2,4,5 | sonarika,anil,amit |
5 | Sales | 7,8,9 | vishal,jiten,shalu |
Cú pháp:
FIND_IN_SET(search-value, List values)
- search-value – bạn có thể nhập một chuỗi giá trị, từ khóa cần tìm kiếm.
- List-values – nó có thể là các giá trị được phân tách bằng dấu phẩy hoặc chỉ là một giá trị. Bạn cũng thể nhập tên Field ở đây.
Function này trả về vị trí của giá trị tìm thấy.
Nếu không tìm thấy function này trả về: 0
3. Ví dụ
# Ex 1:
SELECT FIND_IN_SET('yssyogesh','sonarika,yssyogesh,anil524,admin') as result
Kết quả:
result |
---|
2 |
# Ex 2:
SELECT FIND_IN_SET(5,userid) as result FROM department
Kết quả:
result |
---|
4 |
2 |
0 |
3 |
0 |
# Ex 3
Sử dụng với WHERE để tìm kiếm giá trị: 1 trong cột userid.
SELECT id,dept_name,userid FROM department WHERE FIND_IN_SET(1,userid)
Kết quả:
id | dept_name | userid |
---|---|---|
1 | Finance | 1,2,4,5 |
2 | IT | 1,5 |
4. Sự khác nhau giữa FIND_IN_SET và IN
Cả hai functions này đều được sử dụng để tìm kiếm, vậy điểm khác nhau giữa chúng là gì?
FIND_IN_SET
Là function tốt nhất để bạn tìm kiếm 1 giá trị trong 1 column chứa các giá trị được phân tách bởi dấu phẩy (,).
Trả về vị trị của giá trị trong chuỗi. Nếu không tìm thấy thì trả về 0
IN
Được sử dụng khi tìm kiếm giá trị trong một danh sách giá trị.
Trả về 1 nếu tìm thấy. Nếu không tìm thấy thì trả về 0.
Có vẻ định nghĩa giống nhau nhưng để thấy chi tiết sự khác nhau, các bạn theo dõi 2 ví dụ sau nhé:
Trả về 1 nếu tìm thấy. Nếu không tìm thấy thì trả về 0.
Có vẻ định nghĩa giống nhau nhưng để thấy chi tiết sự khác nhau, các bạn theo dõi 2 ví dụ sau nhé:
# Ex 1 – Sử dụng cả hai để tìm giá trị trong trường có chứa các chữ số được phân tách bằng dấu phẩy.
- Với FIND_IN_SET :
SELECT id,dept_name,userid from department where FIND_IN_SET(2,userid)
Kết quả:
id | dept_name | userid |
---|---|---|
1 | Finance | 1,2,4,5 |
3 | Marketing | 2,3 |
4 | Operational | 2,4,5 |
- Với IN:
SELECT id,dept_name,userid from department where 2 IN(userid)
Kết quả:
id | dept_name | userid |
---|---|---|
3 | Marketing | 2,3 |
4 | Operational | 2,4,5 |
Trong ví dụ trên, sử dụng cả hàm FIND_IN_SET và IN trong mệnh đề WHERE để tìm giá trị 2 trong cột userid chứa id được phân tách bằng dấu phẩy.
Với FIND_IN_SET: nó tìm kiếm giá trị 2 trong userid và trả về tất cả các hàng có giá trị tìm kiếm, nhưng với IN: Nó chỉ trả về những hàng mà nó tìm thấy giá trị tìm kiếm ở vị trí đầu tiên.
# Ex 2 – Sử dụng cả hai để tìm giá trị trong trường có chứa văn bản được phân tách bằng dấu phẩy.
- Với FIND_IN_SET :
SELECT * FROM department where FIND_IN_SET('anil',username)
Kết quả:
id | dept_name | userid | username |
---|---|---|---|
1 | Finance | 1,2,4,5 | yssyogesh,sonarika,anil,amit |
4 | Operational | 2,4,5 | sonarika,anil,amit |
- Với IN:
SELECT * FROM department where 'anil' in(username)
Kết quả: Không trả về bất kỳ giá trị nào.
Như vậy: Hàm FIND_IN_SET thường được sử dụng để tìm kiếm giá trị trong các giá trị được phân tách bằng dấu phẩy trong MySQL. Hàm IN cũng được sử dụng để tìm kiếm nhưng nó không tốt cho các loại tình huống này.
0 Nhận xét:
Đăng nhận xét
Rất mong các ý kiến của các bạn khi đọc bài viết này !