Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Bộ đảo chữ cái với sql's%

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%'



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Khi nào thì Flush Privileges trong MySQL thực sự cần thiết?

  2. Danh sách SELECT không nằm trong mệnh đề GROUP BY và chứa cột không được tổng hợp .... không tương thích với sql_mode =only_full_group_by

  3. Kết nối với điều khiển từ xa Sql của tôi hiển thị cho tôi quyền truy cập bị từ chối đối với người dùng [email được bảo vệ] (Sử dụng Mật khẩu:Có)

  4. Khắc phục “LỖI 1136 (21S01):Số cột không khớp với số giá trị ở hàng 2” khi sử dụng Câu lệnh VALUES trong MySQL

  5. MySQL - Trừ giá trị từ hàng trước, nhóm theo