CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết blog CFSDN này có giải thích chi tiết về công dụng của hàm find_in_set() trong mysql do tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.
Đầu tiên, hãy đưa ra một ví dụ:
Có một trường loại trong bảng bài viết, nơi lưu trữ loại bài viết, bao gồm 1 tiêu đề, 2 đề xuất, 3 điểm nóng, 4 đồ họa và văn bản, v.v.
Bây giờ có bài viết vừa là tiêu đề, vừa là chủ đề nóng, vừa là hình ảnh, văn bản. Nó được lưu dưới dạng 1,3,4. Vậy làm cách nào để sử dụng SQL để tìm tất cả các bài viết có đồ họa và văn bản có loại 4? ?
Đây là lúc find_in_set của chúng tôi phát huy tác dụng. Sau đây là nội dung được trích dẫn:
?
1
|
lựa chọn
*
từ
bài báo
Ở đâu
TÌM_TRONG_BỘ(
'4'
,kiểu)
|
-------------------------------------------------- -------- 。
Cú pháp hàm find_in_set trong hướng dẫn MySQL:
TÌM_THÔNG_THÔNG_THEO(chuỗi,danh_str) 。
str Chuỗi được truy vấn.
Các tham số tên trường strlist được phân tách bằng dấu "," chẳng hạn như (1,2,6,8).
Truy vấn kết quả chứa (str) trong trường (strlist) và kết quả trả về là null hoặc bản ghi.
Nếu chuỗi str nằm trong danh sách chuỗi strlist bao gồm N chuỗi con thì giá trị trả về nằm trong khoảng từ 1 đến N. Danh sách chuỗi là một chuỗi bao gồm các chuỗi con được phân tách bằng ký tự ','. Nếu đối số đầu tiên là một chuỗi không đổi và đối số thứ hai là một cột thuộc loại SET, thì hàm FIND_IN_SET() được tối ưu hóa để sử dụng các phép tính bit. Nếu str không có trong strlist hoặc strlist là một chuỗi rỗng thì giá trị trả về là 0. Nếu bất kỳ tham số nào là NULL thì giá trị trả về là NULL. Hàm này sẽ không hoạt động bình thường nếu đối số đầu tiên chứa dấu phẩy (',').
-------------------------------------------------- ------ 。
ví dụ:
?
1
2
3
4
5
|
mysql>
LỰA CHỌN
TÌM_TRONG_BỘ(
'b'
,
'a, b, c, d'
);
-> 2 vì b được đặt ở vị trí 2 trong tập hợp strlist bắt đầu từ 1
lựa chọn
TÌM_TRONG_BỘ(
'1'
,
'1'
); Trả về là 1. Bộ sưu tập strlist tại thời điểm này hơi đặc biệt. Trên thực tế, nó yêu cầu chuỗi trước đó phải nằm trong bộ sưu tập chuỗi sau trước khi trả về một số lớn hơn 0.
lựa chọn
TÌM_TRONG_BỘ(
'2'
,
'1,2'
); trả về 2
lựa chọn
TÌM_TRONG_BỘ(
'6'
,
'1'
); trả về 0
|
-------------------------------------------------- ------ 。
Để ý:
?
1
|
lựa chọn
*
từ
nút cây
Ở đâu
TÌM_THÔNG_THÔNG_THÔNG(id,
'1,2,3,4,5'
);
|
Sử dụng hàm find_in_set để trả về nhiều bản ghi cùng một lúc. Id là một trường của bảng và mỗi bản ghi có id bằng 1, 2, 3, 4 và 5. Nó hơi giống với trong (set).
?
1
|
lựa chọn
*
từ
nút cây
Ở đâu
nhận dạng
TRONG
(1,2,3,4,5);
|
-------------------------------------------------- ------ 。
Sự khác biệt giữa find_in_set() và trong:
Lập một bảng kiểm tra để minh họa sự khác biệt giữa hai.
?
1
2
3
4
5
6
7
8
9
|
TẠO NÊN
BÀN
`tb_test` (
`mã số`
số nguyên
(8)
KHÔNG
VÔ GIÁ TRỊ
tự động tăng,
`
tên
`
varchar
(255)
KHÔNG
VÔ GIÁ TRỊ
,
`danh sách`
varchar
(255)
KHÔNG
VÔ GIÁ TRỊ
,
SƠ ĐẲNG
CHÌA KHÓA
(`mã`)
);
CHÈN
VÀO TRONG
`tb_test`
GIÁ TRỊ
(1,
'tên'
,
'daodao,xiaohu,xiaoqin'
);
CHÈN
VÀO TRONG
`tb_test`
GIÁ TRỊ
(2,
'tên2'
,
'xiaohu,daodao,xiaoqin'
);
CHÈN
VÀO TRONG
`tb_test`
GIÁ TRỊ
(3,
'tên3'
,
'xiaoqin,daodao,xiaohu'
);
|
Ban đầu tôi nghĩ rằng mysql có thể thực hiện các truy vấn như vậy:
?
1
|
LỰA CHỌN
nhận dạng,
tên
,danh sách
từ
tb_kiểm tra
Ở ĐÂU
'daodao'
TRONG
(danh sách);
|

Trên thực tế, điều này là không thể. Bằng cách này, truy vấn sẽ chỉ hợp lệ khi giá trị của trường danh sách bằng 'daodao' (khớp hoàn toàn với chuỗi trước IN). Nếu không, sẽ không thu được kết quả nào, ngay cả khi '. daodao' thực sự có trong danh sách.
Hãy nhìn vào điều này một lần nữa:
?
1
|
LỰA CHỌN
nhận dạng,
tên
,danh sách
từ
tb_kiểm tra
Ở ĐÂU
'daodao'
TRONG
(
'libk'
,
'zyfon'
,
'daodao'
);
|

Điều này ổn thôi.
Sự khác biệt giữa hai mặt hàng này là gì? Tại sao kết quả đầu tiên không nhận được kết quả chính xác còn kết quả thứ hai thì có? Lý do thực sự là (danh sách) trong danh sách (1) là một biến, trong khi ('libk', 'zyfon', 'daodao') trong (2) là một hằng số.
Vì vậy, nếu bạn muốn (1) hoạt động chính xác, bạn cần sử dụng find_in_set()
?
1
|
LỰA CHỌN
nhận dạng,
tên
,danh sách
từ
tb_kiểm tra
Ở ĐÂU
TÌM_TRONG_BỘ(
'daodao'
,danh sách);
|

Tóm tắt:
Vì vậy, nếu danh sách là hằng số, bạn có thể sử dụng IN trực tiếp, nếu không, bạn cần sử dụng hàm find_in_set().
-------------------------------------------------- ------ 。
Sự khác biệt giữa find_in_set() và thích:
Trong mysql, đôi khi khi thực hiện truy vấn cơ sở dữ liệu, chúng ta cần lấy các bản ghi chứa một giá trị nhất định trong một trường nhất định, nhưng điều này không thể giải quyết bằng cách sử dụng like có thể tìm thấy các bản ghi mà chúng ta không muốn và nó chính xác hơn. , lúc này hàm FIND_IN_SET của mysql rất hữu ích.
Tạo bảng và chèn câu lệnh:
?
1
2
3
4
5
6
7
8
|
TẠO NÊN
BÀN
người dùng(
nhận dạng
số nguyên
(6)
KHÔNG
VÔ GIÁ TRỊ
TỰ ĐỘNG TĂNG,
tên
VARCHAR
(20)
KHÔNG
VÔ GIÁ TRỊ
,
giới hạn
VARCHAR
(50)
KHÔNG
VÔ GIÁ TRỊ
,
SƠ ĐẲNG
CHÌA KHÓA
(nhận dạng)
);
CHÈN
VÀO TRONG
người dùng(
tên
, giới hạn)
GIÁ TRỊ
(
'Tiểu Trương'
,
'1,2,12'
);
CHÈN
VÀO TRONG
người dùng(
tên
, giới hạn)
GIÁ TRỊ
(
'Tiểu Vương'
,
'11,22,32'
);
|
Giới hạn thể hiện các quyền mà người dùng sở hữu (được phân tách bằng dấu phẩy). Bây giờ tôi muốn truy vấn người dùng với quyền số 2. Nếu sử dụng từ khóa like, kết quả truy vấn như sau:
?
1
|
LỰA CHỌN
*
TỪ
người sử dụng
Ở ĐÂU
giới hạn
GIỐNG
'%2%'
;
|

Bằng cách này, người dùng không có quyền '2' đối với phần dữ liệu thứ hai cũng được tìm thấy, điều này không phù hợp với mong đợi. Phần sau đây sử dụng hàm mysql find_in_set() để giải quyết vấn đề.
?
1
|
LỰA CHỌN
*
TỪ
người sử dụng
Ở ĐÂU
FIND_IN_SET(2,giới hạn);
|

Bằng cách này, chúng ta có thể đạt được hiệu quả mong muốn và vấn đề được giải quyết! .
Lưu ý: Hàm chuỗi mysql find_in_set(str1, str2) trả về chỉ số vị trí của str1 trong str2 phải cách nhau bằng dấu ",".
Tóm tắt: like là đối sánh mờ rộng, không có dấu phân cách trong chuỗi, Find_IN_SET là đối sánh chính xác, các giá trị trường được phân tách bằng tiếng Anh “,”, kết quả truy vấn Find_IN_SET nhỏ hơn kết quả của lượt thích truy vấn.
Tóm tắt.
Trên đây là giải thích chi tiết về cách sử dụng hàm find_in_set() trong MySQL được biên tập viên giới thiệu. Nếu có thắc mắc vui lòng để lại tin nhắn và biên tập viên sẽ trả lời bạn. thời gian. Tôi cũng xin cảm ơn mọi người đã ủng hộ trang web của tôi! .
Link gốc: https://blog.csdn.net/jiangeeq/article/details/80340835.
Cuối cùng, bài viết này về cách sử dụng chi tiết hàm find_in_set() trong mysql kết thúc tại đây. Nếu bạn muốn biết thêm về cách sử dụng chi tiết hàm find_in_set() trong mysql, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. mong mọi người sẽ ủng hộ blog của mình trong tương lai nhé! .
Tôi là một lập trình viên xuất sắc, rất giỏi!