2010-09-10 83 views
5

,想到这样做的幼稚的方法是: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)); 

然而,“(选择名称,莱文斯坦(姓名,参数) 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忍者任何投入将不胜感激;)

回答

-1
SELECT name, min(levenshtein(name, *parameter)) as lev 
FROM my_table 
GROUP BY name; 
+0

这是行不通的。 – chaos 2010-09-10 18:55:45

+0

它确实不会产生所需的结果...:/ – Vermillon 2010-09-10 21:52:46

1
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

我认为您在'where lev =(select min(lev))'部分中缺少'from ...'。 – 2012-02-06 16:51:05

+0

它工作时没有'FROM my_temp_table',如果我尝试引用where子句中的临时表,它会给我一个语法错误(没有这样的表)。 – Miranda 2012-02-06 23:40:25

0
SELECT * FROM 
(
    SELECT * 
    FROM `test`.`test` 
) as temp 
WHERE compute_total_price_single = (SELECT MIN(compute_total_price_single)); 
相关问题