2013-09-04 10 views
2

У меня есть имена песен и их предварительно вычисленный soundex, хранящийся в таблице mysql. Я хочу сравнить soundex пользовательского ввода с предварительно рассчитанными soundex'ами. И получите результаты в порядке возрастания разницы между именем пользователя и именем песни.Mysql - Рассчитайте разницу в звуковых сигналах между двумя строками

Я попытался следующий запрос (в Java):

String query="SELECT * FROM song ORDER BY STRCMP(pre_calculated_soundex,SOUNDEX("+user_input+")) ASC "; 

Но STRCMP возвращает только 1,0 или -1. Так что упорядочение неверно.

Также попробовал WHERE pre_calculated_soundex=SOUNDEX(user_input), но это просто возвращает точно соответствующий soundex.

+0

Можете ли вы описать, что вы имеете в виду с «разницей», точно ? – Aioros

+0

@Aioros Как различие реализовано на сервере MSSQL. –

+0

В соответствии с документами DIFFERENCE возвращает количество символов, которые одинаковы в SOUNDEXes двух строк. Это будет довольно сложно реализовать в запросе MySQL. Возможно, вам лучше написать хранимую процедуру или управлять ею на вашем языке программирования. – Aioros

ответ

1

Полностью низкотехнологичное и предполагая, что только первые четыре символа функции SOUNDEX используется, а также при условии, что «аааа» является пользовательский ввод

SELECT * 
FROM song 
ORDER BY Substr(pre_calculated_soundex, 1, 1) = 
        Substr(Soundex("aaaa"), 1, 1) 
               + Substr(pre_calculated_soundex 
        , 2, 1) = 
        Substr 
        (Soundex("aaaa"), 2, 1) 
        + Substr(pre_calculated_soundex, 3, 1) 
        = Substr(Soundex("aaaa"), 3, 1) 
         + Substr(pre_calculated_soundex, 4, 1 
        ) 
         = Substr(Soundex("aaaa"), 4, 1) 
+0

Большое спасибо за идею, поскольку она дала мне направление. Еще один вопрос: сколько раз будет вызываться функция soundex в вашем запросе? Оптимистично ли предположить, что его нужно вызывать только один раз для того же входа? [Ссылка вопроса] (http://stackoverflow.com/questions/18616924/does-mysql-query-cache-the-dynamically-calculated-columns) –

+0

Я просто ответил на ваш другой запрос, но просто чтобы указать на решение, Ответ: yes mysql называет его 4 раза, и чтобы избежать этого, вы делаете подзапрос, для подробного ответа см. вопрос, связанный выше – skv