MySQL: выбор строк, имеющих минимальное значение вычисляемого столбца

Наивный способ сделать это, который приходит на ум, будет следующим:

SELECT name, lev FROM
(SELECT name, levenshtein(name, *parameter*) as lev FROM my_table)
WHERE 
lev = (SELECT MIN(lev) FROM 
(SELECT name, levenshtein(name, *parameter*) as lev FROM my_table ));

Однако подзапрос "(SELECT name, levenshtein(name, parameter) as lev FROM my_table)", который очень дорог (огромная таблица), повторяется дважды, что кажется ужасно неэффективным.

Я как-то, хотя вы могли бы написать:

SELECT name, lev FROM
(SELECT name, levenshtein(name, *parameter*) as lev FROM my_table) as my_temp_table
WHERE 
lev = (SELECT MIN(lev) FROM my_temp_table);

Но, похоже, это не работает.

Есть ли чистый способ оптимизировать этот запрос для скорости? Я пропустил что-то очевидное?

Должен ли я полагаться на временные таблицы? (пытаясь избежать этого из-за накладных расходов/сложности, поскольку они не кажутся подходящими для очень частых/одновременных запросов)

Мы будем очень признательны за любой вклад от ниндзя SQL;)


person Vermillon    schedule 10.09.2010    source источник


Ответы (2)


select * from
(
SELECT * 
FROM `test`.`test`
)
as temp
where compute_total_price_single=(select min(compute_total_price_single))
;

Это то, что я сделал для своей проблемы, поскольку это сработало, я подозреваю, что следующее также будет работать:

SELECT name, lev FROM
    (SELECT name, levenshtein(name, *parameter*) as lev FROM my_table) as my_temp_table
WHERE 
lev = (SELECT MIN(lev));

Я использую MySQL 5.

person Miranda    schedule 06.02.2012
comment
Я думаю, что вам не хватает from ... в части where lev = (select min(lev)). - person Matt Fenwick; 06.02.2012
comment
Он работает без FROM my_temp_table, и доза выдаст мне синтаксическую ошибку (такой таблицы нет), если я попытаюсь сослаться на временную таблицу в предложении where. - person Miranda; 07.02.2012

person    schedule
comment
И это действительно не дает желаемого результата... :/ - person Vermillon; 11.09.2010