Pertama saya ingin memperbaiki kesalahan dalam pertanyaan Anda. Dalam pertanyaan Anda, maksud Anda _
bukan %
. %
berarti sejumlah karakter (nol atau lebih). Gunakan _
berarti tepat satu karakter.
Sekarang ke solusinya... Anda sebenarnya tidak perlu kata yang diurutkan disimpan dalam database. Anda bisa melakukan ini:
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%'
Jika Anda memiliki surat duplikat di input Anda, perlu menangani ini dengan benar untuk memastikan bahwa semua hasil berisi semua surat duplikat. Misalnya jika inputnya adalah FOO__
anda perlu memeriksa bahwa setiap kata cocok dengan keduanya %F%
dan %O%O%
.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'
Perhatikan bahwa pendekatan ini akan memerlukan pemindaian penuh tabel sehingga tidak akan terlalu efisien. Anda dapat sedikit memperbaikinya dengan menyimpan panjang setiap kata di kolom terpisah dan mengindeks kolom itu.
Jika Anda memiliki sortedword
maka Anda dapat meningkatkan kinerja dengan menghilangkan %
antara huruf yang digandakan karena Anda tahu bahwa mereka akan muncul secara berurutan di sortedword
. Ini dapat meningkatkan kinerja karena mengurangi jumlah pelacakan balik yang diperlukan untuk kecocokan yang gagal.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'
Pendekatan lain yang membutuhkan sortedword
untuk hadir adalah sebagai berikut:
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'
Sekali lagi ini membutuhkan pemindaian penuh tabel. Sekali lagi, jika Anda memiliki huruf yang berulang, Anda tidak memerlukan %
di antara mereka.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'