В настоящее время у меня есть таблица базы данных, называемая словарем, со следующими полями для всех записей словаря:
public static final String COLUMN_NAME_UID = "_id_";
public static final String COLUMN_NAME_WORD = "word";
public static final String COLUMN_NAME_WORD = "wordSorted";
public static final String COLUMN_NAME_WORD_LENGTH = "length";
public static final String COLUMN_NAME_COUNT_A = "count_A";
public static final String COLUMN_NAME_COUNT_B = "count_B";
public static final String COLUMN_NAME_COUNT_C = "count_C";
public static final String COLUMN_NAME_COUNT_D = "count_D";
public static final String COLUMN_NAME_COUNT_E = "count_E";
public static final String COLUMN_NAME_COUNT_F = "count_F";
public static final String COLUMN_NAME_COUNT_G = "count_G";
public static final String COLUMN_NAME_COUNT_H = "count_H";
public static final String COLUMN_NAME_COUNT_I = "count_I";
public static final String COLUMN_NAME_COUNT_J = "count_J";
public static final String COLUMN_NAME_COUNT_K = "count_K";
public static final String COLUMN_NAME_COUNT_L = "count_L";
public static final String COLUMN_NAME_COUNT_M = "count_M";
public static final String COLUMN_NAME_COUNT_N = "count_N";
public static final String COLUMN_NAME_COUNT_O = "count_O";
public static final String COLUMN_NAME_COUNT_P = "count_P";
public static final String COLUMN_NAME_COUNT_Q = "count_Q";
public static final String COLUMN_NAME_COUNT_R = "count_R";
public static final String COLUMN_NAME_COUNT_S = "count_S";
public static final String COLUMN_NAME_COUNT_T = "count_T";
public static final String COLUMN_NAME_COUNT_U = "count_U";
public static final String COLUMN_NAME_COUNT_V = "count_V";
public static final String COLUMN_NAME_COUNT_W = "count_W";
public static final String COLUMN_NAME_COUNT_X = "count_X";
public static final String COLUMN_NAME_COUNT_Y = "count_Y";
public static final String COLUMN_NAME_COUNT_Z = "count_Z";
Я хочу иметь возможность искать instance test* и находить все слова, которые можно составить из «t», «e», «s», «t» и подстановочного знака, например такие слова, как «tests» (s — это подстановочный знак) , «setts» (s — подстановочный знак), «set», «tet» «es», «te», «best» (b — подстановочный знак) и т. д. Все, что вы можете сделать с любой комбинацией этих букв.
Я пробовал такие методы, но этот пример находит только четыре буквы без подстановочного знака:
SELECT * FROM dictionary WHERE
count_E=1 AND
count_S=1 AND
count_T=2
SELECT * FROM dictionary WHERE length <=4
Это производит:
"137075" "sett" "estt"
"145808" "stet" "estt"
"153675" "test" "estt"
"153851" "tets" "estt"
Теперь, я знаю, это своего рода скрытая математическая задача в глубине души.
Вот как я могу получить все слова из 5 букв с одним пробелом и всеми буквами, указанными в последнем запросе:
SELECT * FROM dictionary WHERE
count_E=1 AND
count_S=1 AND
count_T=2
INTERSECT
SELECT * FROM dictionary WHERE length <=5
Полученные результаты:
"97705" "netts" "enstt"
"137075" "sett" "estt"
"145250" "state" "aestt"
"145808" "stet" "estt"
"152303" "taste" "aestt"
"152333" "tates" "aestt"
"152632" "teats" "aestt"
"153361" "tents" "enstt"
"153675" "test" "estt"
"153676" "testa" "aestt"
"153733" "testy" "estty"
"153769" "teths" "ehstt"
"153851" "tets" "estt"
"153874" "texts" "esttx"
"156575" "totes" "eostt"
"157952" "trets" "erstt"
"172060" "yetts" "estty"
Однако мне пришлось бы пройти через все итерации комбинаций букв, чтобы получить все скрытые подслова... Может ли кто-нибудь помочь мне придумать более элегантный подход к поиску анаграмм и подслов из запроса и выше к двум подстановочным знакам? Я также знаю, что вы можете использовать REGEXP в SQL, так что это может быть способом. На данный момент я не знаю, и я несу эту проблему в улей...
Есть ли запрос или серия запросов, пересечения, соединения и т. д., которые помогли бы мне решить эту проблему?
ОБНОВЛЕНИЕ Думаю, я наткнулся на это, но не уверен, что оно работает правильно. Любая помощь будет оценена по достоинству:
SELECT * FROM dictionary WHERE
(
count_E<=1 AND
count_S<=1 AND
count_T<=1
)
INTERSECT SELECT * FROM dictionary WHERE length =(count_E+count_S+count_T+1) ORDER BY length
+1 должен учитывать одно пустое место. Для двух я думаю просто сделать +2 и т. д. +0 будут просто эти буквы и все, что вы можете сделать из них.