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

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

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, параметр ) 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 будет принята с благодарностью;)

Ответы [ 3 ]

1 голос
/ 06 февраля 2012
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.

0 голосов
/ 06 февраля 2012
SELECT * FROM
(
    SELECT * 
    FROM `test`.`test`
) as temp
WHERE compute_total_price_single = (SELECT MIN(compute_total_price_single));
0 голосов
/ 10 сентября 2010
SELECT name, min(levenshtein(name, *parameter)) as lev
FROM my_table
GROUP BY name;
...