Временная переменная в выражении SQL - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть определенная в SQL функция, которая вычисляет расстояние Левенштейна между двумя заданными строками.

В настоящее время я вызываю эту функцию способом, аналогичным приведенному ниже:

SELECT * FROM movies M WHERE levenshtein ( M.title, "Foobar" ) < 5;

Iхотел бы упорядочить результаты в порядке возрастания расстояния Левенштейна, но не знаю, как это сделать.

Есть ли способ сделать это, или мне придется сделать это по-другому

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

levenshtein() - дорогая функция.Если производительность вообще актуальна, вы можете не вызывать ее дважды.Используйте суб-выбор для этого.(В других СУБД вы можете использовать CTE, но MySQL этого не имеет.)

Запустите тест, чтобы увидеть, какой из них работает лучше.

SELECT some_col
FROM   (SELECT some_col, levenshtein(title, 'Foobar') AS levi FROM movies) AS m
WHERE  levi < 5
ORDER  BY levi;

Кстати, вы этого не сделалихотите добавить псевдоним таблицы в список SELECT, как в вашем примере, не так ли?

0 голосов
/ 29 апреля 2012

Для тех, кто ищет похожие ответы, у меня есть некоторый практический опыт решения такой же проблемы.

Хотя это работает довольно хорошо, проблема с ...

ORDER BY levenshtein ( M.title, "Foobar" )

... дело не в том, что он выполняет функцию дважды (из тестирования таблицы с 500 000 строк, я не верю в это), а в том, что запрос использует сортировку файлов для выполнения ORDER BY. Как вы, возможно, знаете, включение столбцов ORDERed в предложение WHERE устраняет необходимость в сортировке файлов. Проблема в том, что значения ORDERed не являются столбцами и не работают так, как это делают чистые ссылки на столбцы.

0 голосов
/ 14 ноября 2011

Я полагаю, что вы можете просто повторно использовать функцию в предложении order by следующим образом:

SELECT *
FROM movies M
WHERE levenshtein ( M.title, "Foobar" ) < 5
ORDER BY levenshtein ( M.title, "Foobar" );

Другой вариант - вывести результаты всех записей с добавлением столбца для вашей функциивызвать во временную таблицу, а затем выбрать из нее с помощью предложений WHERE и ORDER BY в соответствующем столбце.

0 голосов
/ 14 ноября 2011
ORDER BY levenshtein ( M.title, "Foobar" )
...