Trước tiên, tôi muốn sửa một lỗi trong câu hỏi của bạn. Trong các truy vấn của bạn, ý bạn là _
không phải %
. %
có nghĩa là bất kỳ số ký tự nào (không hoặc nhiều hơn). Sử dụng _
nghĩa là chính xác một ký tự.
Bây giờ đến giải pháp ... bạn thực sự không cần từ được sắp xếp được lưu trữ trong cơ sở dữ liệu. Bạn chỉ có thể làm điều này:
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 6
AND word LIKE '%W%'
AND word LIKE '%O%'
AND word LIKE '%R%'
AND word LIKE '%D%'
Nếu bạn có các chữ cái trùng lặp trong đầu vào của mình, cần phải xử lý điều này một cách chính xác để đảm bảo rằng tất cả các kết quả đều chứa tất cả các chữ cái trùng lặp. Ví dụ:nếu đầu vào là FOO__
bạn cần kiểm tra xem mỗi từ có khớp với cả %F%
không và %O%O%
.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'
Lưu ý rằng cách tiếp cận này sẽ yêu cầu quét toàn bộ bảng vì vậy nó sẽ không đặc biệt hiệu quả. Bạn có thể cải thiện một chút mọi thứ bằng cách lưu trữ độ dài của mỗi từ trong một cột riêng biệt và lập chỉ mục cho cột đó.
Nếu bạn có sortedword
thì bạn có thể cải thiện hiệu suất bằng cách bỏ qua %
giữa các chữ cái trùng lặp vì bạn biết rằng chúng sẽ xuất hiện liên tiếp trong sortedword
. Điều này có thể cải thiện hiệu suất vì nó làm giảm số lượng backtracking cần thiết cho các kết quả phù hợp không thành công.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'
Một cách tiếp cận khác yêu cầu sortedword
hiện tại như sau:
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'
Một lần nữa, điều này yêu cầu quét toàn bộ bảng. Một lần nữa, nếu bạn có các chữ cái lặp lại, bạn không cần %
giữa chúng.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'