Просто используйте ORDER BY
с LIMIT
, чтобы получить лучший результат только:
SELECT input, response,
(input LIKE '% you %') +
(input LIKE '% are %') +
(input LIKE '% here %')
AS matches
FROM allData
HAVING matches > 0
ORDER BY matches DESC LIMIT 1;
В случае равенства вы получите только один случайный лучший показатель хоть. Если вы хотите все, тогда перейдите к ответу Джона Боллинджера.
SQL скрипт: http://sqlfiddle.com/#!9/1ece1/3.
Если вы хотите посчитать несколько матчей, использовать некоторые математические: удалить строку поиска из входных данных и подсчитать, как часто удаляют его длина:
SELECT input, response,
((length(input) - length(replace(input, ' you ', '')))/length(' you ')) +
((length(input) - length(replace(input, ' are ', '')))/length(' are ')) +
((length(input) - length(replace(input, ' here ', '')))/length(' here '))
AS matches
FROM allData
HAVING matches > 0
ORDER BY matches DESC LIMIT 1;
SQL скрипку: http://sqlfiddle.com/#!9/f680b/3.
И еще одна скрипка, чтобы показать, как это работает: http://sqlfiddle.com/#!9/f680b/1.
Вот запрос Джона с той же техникой:
SELECT input, response,
((length(input) - length(replace(input, ' you ', '')))/length(' you ')) +
((length(input) - length(replace(input, ' are ', '')))/length(' are ')) +
((length(input) - length(replace(input, ' here ', '')))/length(' here '))
AS matches
FROM allData
HAVING matches > 0
AND matches =
(
SELECT MAX(
((length(input) - length(replace(input, ' you ', '')))/length(' you ')) +
((length(input) - length(replace(input, ' are ', '')))/length(' are ')) +
((length(input) - length(replace(input, ' here ', '')))/length(' here '))
)
FROM allData
);
SQL скрипка: http://sqlfiddle.com/#!9/57098/1.
Что касается вас, вы, вы правы; удалив «ты» из строки, я беру с собой пространство, необходимое для поиска следующего «ты». Вы можете легко обойти это, хотя, заменив каждое пространство двумя в input
перед выполнением операции. И вы, возможно, захотите добавить ведущее и тренировочное пространство. (Возможно, вы даже захотите применить LOWER()
к строке, чтобы найти «вы», а также «вы».)
Так заменить
FROM allData
с
FROM
(
select
replace(concat(' ', input, ' '), ' ', ' ') as input,
response
from allData
) prepared
Перед тем, как спички, вы не можете знать, что является не более, так что это нормально, если это не работает. Я бы получил все совпадения, сгруппированные по совпадениям, а затем сортировку по счету или поиск макс в этой группе, а затем выбор необходимых полей в них. – CntkCtn
@CntkCtn Пожалуйста, попробуйте ответить. – jessica
Чтобы ответить, мне нужна БД и сделайте тесты, чтобы быть уверенным, что я правильно даю ответ, и у меня его нет на данный момент. Я буду держать его в качестве комментария. – CntkCtn