6

The naive way of doing this that comes to mind would be:

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

However the "(SELECT name, levenshtein(name, parameter) as lev FROM my_table)" subquery, which is very expensive (huge table) is repeated twice which seems horribly inefficient.

I somehow though you could write :

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

But it doesn't seem to work.

Is there a clean way to optimize that query for speed? Did I miss something obvious?

Do I have to rely on temporary tables? (trying to avoid it due to the overhead/complexity as they don't seem appropriate for very frequent/concurrent queries)

Any input from SQL ninjas would be greatly appreciated ;)

Vermillon
  • 253
  • 1
  • 3
  • 8

3 Answers3

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

This is what I did for my problem, since it worked I suspect the following would also work:

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

I'm using MySQL 5.

Mzq
  • 1,796
  • 4
  • 30
  • 65
  • I think you're missing a `from ...` in the `where lev = (select min(lev))` part. – Matt Fenwick Feb 06 '12 at 16:51
  • It works without the `FROM my_temp_table`, and dose give me a syntax error(no such table) if I try to refer to the temp table in the `where` clause. – Mzq Feb 06 '12 at 23:40
0
SELECT * FROM
(
    SELECT * 
    FROM `test`.`test`
) as temp
WHERE compute_total_price_single = (SELECT MIN(compute_total_price_single));
Ragunath Jawahar
  • 19,513
  • 22
  • 110
  • 155
Xiao Zohu
  • 1
  • 1
-1
SELECT name, min(levenshtein(name, *parameter)) as lev
FROM my_table
GROUP BY name;
Ingo Karkat
  • 167,457
  • 16
  • 250
  • 324
Jeremy
  • 124
  • 2