2010-09-10 18 views
5

Il modo ingenuo di fare questo che viene in mente sarebbe:MySQL: Selezione delle righe aventi valore minimo di una colonna calcolata

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

Tuttavia il "(SELECT nome, levenshtein (nome, parametro) as lev FROM my_table) "la subquery, che è molto costosa (tabella enorme) viene ripetuta due volte, il che sembra orribilmente inefficiente.

io in qualche modo anche se si potrebbe scrivere:

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

Ma non sembra funzionare.

C'è un modo pulito per ottimizzare quella query per la velocità? Mi sono perso qualcosa di ovvio?

Devo fare affidamento su tabelle temporanee? (cercando di evitare che a causa del sovraccarico/complessità non sembrano appropriati per molto frequenti domande/simultanee)

Qualunque input da ninja SQL sarebbe molto apprezzato;)

risposta

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

Non funziona. – chaos

+0

E in effetti non produce il risultato desiderato ...:/ – Vermillon

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

Questo è quello che ho fatto per il mio problema, poiché ha funzionato ho il sospetto che quanto segue potrebbe anche funzionare:

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

sto usando MySQL 5.

+0

Penso che manchi un 'da ...' nella sezione 'dove lev = (select min (lev))'. –

+0

Funziona senza il parametro 'FROM my_temp_table', e la dose mi dà un errore di sintassi (nessuna tabella di questo tipo) se provo a fare riferimento alla tabella temporanea nella clausola' where'. – Miranda

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