Я создаю слово unscrambler (php/mysql), которое принимает пользовательский ввод от 2 до 8 букв и возвращает слова от 2 до 8 букв, которые могут быть сделаны из этих букв, не обязательно используя все буквы, но определенно не включая больше букв, чем указано.
Пользователь вводит что-то вроде MSIKE или MSIKEI (два i) или любую комбинацию букв или нескольких вхождений буквы.
В нижеприведенном запросе будут найдены все вхождения слов, содержащих M, S, I, K или E.
Однако в приведенном ниже запросе также возвращаются слова, которые имеют несколько вхождений писем, которые не запрашиваются. Например, слово meek будет возвращено, хотя оно имеет два e, и пользователь не вводил два e или поцелуй слова, даже если пользователь не вводил s дважды.
SELECT word
FROM words
WHERE word REGEXP '[msike]'
AND has_a=0
AND has_b=0
AND has_c=0
AND has_d=0
(we skip e) or we could add has_e=1
AND has_f=0
...and so on...skipping letters m, s, i, k, and e
AND has_w=0
AND has_x=0
AND has_y=0
AND has_z=0
Обратите внимание, что столбцы has_a, has_b и т.д. равны 1, если буква имеет слово в слове или 0, если нет.
Я открыт для любых изменений в схеме таблиц.
Этот сайт: http://grecni.com/texttwist.php - хороший пример того, что я пытаюсь подражать.
Вопрос заключается в том, как изменить запрос, чтобы не возвращать слова с несколькими вхождениями буквы, если только пользователь не ввел букву несколько раз. Группировка по длине слова будет дополнительным бонусом.
Большое спасибо.
EDIT: я изменил db по предложению @awei, has_ {letter} теперь count_ {letter} и сохраняет общее количество вхождений соответствующей буквы в соответствующее слово. Это может быть полезно, когда пользователь вводит письмо несколько раз. Например: пользователь вводит MSIKES (два с).
Кроме того, я отказался от подхода REGEXP, как показано в исходной инструкции SQL. Работая над большей частью работы со стороны PHP, но многие препятствия все еще на пути.
EDIT: Включено первые 10 строк из таблицы
id word alpha otcwl ospd csw sowpods dictionary enable vowels consonants start_with end_with end_with_ing end_with_ly end_with_xy count_a count_b count_c count_d count_e count_f count_g count_h count_i count_j count_k count_l count_m count_n count_o count_p count_q count_r count_s count_t count_u count_v count_w count_x count_y count_z q_no_u letter_count scrabble_points wwf_points status date_added
1 aa aa 1 0 0 1 1 1 aa a a 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 1 2015-11-12 05:39:45
2 aah aah 1 0 0 1 0 1 aa h a h 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 5 1 2015-11-12 05:39:45
3 aahed aadeh 1 0 0 1 0 1 aae hd a d 0 0 0 2 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 9 8 1 2015-11-12 05:39:45
4 aahing aaghin 1 0 0 1 0 1 aai hng a g 1 0 0 2 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 6 10 11 1 2015-11-12 05:39:45
5 aahs aahs 1 0 0 1 0 1 aa hs a s 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 7 6 1 2015-11-12 05:39:45
6 aal aal 1 0 0 1 0 1 aa l a l 0 0 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 4 1 2015-11-12 05:39:45
7 aalii aaiil 1 0 0 1 1 1 aaii l a i 0 0 0 2 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 6 1 2015-11-12 05:39:45
8 aaliis aaiils 1 0 0 1 0 1 aaii ls a s 0 0 0 2 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 6 6 7 1 2015-11-12 05:39:45
9 aals aals 1 0 0 1 0 1 aa ls a s 0 0 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 4 5 1 2015-11-12 05:39:45
10 aardvark aaadkrrv 1 0 0 1 1 1 aaa rdvrk a k 0 0 0 3 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 8 16 17 1 2015-11-12 05:39:45