2010-09-10 19 views
5

La forma ingenua de hacer esto que viene a la mente sería:MySQL: Al seleccionar las filas que tienen un valor mínimo de una columna calculada

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)); 

Sin embargo, el "(SELECT nombre, levenshtein (nombre, parámetro) como lev FROM my_table) "subconsulta, que es muy costosa (mesa enorme) se repite dos veces, lo que parece terriblemente ineficiente.

de alguna manera, aunque se podría escribir:

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); 

Pero no parece funcionar.

¿Existe alguna forma clara de optimizar esa consulta en cuanto a velocidad? ¿Me perdí algo obvio?

¿Debo confiar en las tablas temporales? (tratando de evitar que debido a la sobrecarga/complejidad, ya que no parecen apropiadas para consultas muy frecuentes/concurrentes)

Cualquier entrada de ninjas SQL sería muy apreciada;)

Respuesta

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

Eso no va a funcionar. – chaos

+0

Y de hecho no produce el resultado deseado ...:/ – Vermillon

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

Esto es lo que hice para mi problema, ya que trabajó sospecho que el siguiente también funcionaría:

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

estoy usando MySQL 5.

+0

Creo que te falta un 'from ...' en la parte 'where lev = (select min (lev))'. –

+0

Funciona sin el 'FROM my_temp_table', y dosificar me da un error de sintaxis (sin dicha tabla) si trato de referirme a la tabla temporal en la cláusula' where'. – Miranda

0
SELECT * FROM 
(
    SELECT * 
    FROM `test`.`test` 
) as temp 
WHERE compute_total_price_single = (SELECT MIN(compute_total_price_single)); 
Cuestiones relacionadas