Autor Zpráva
igamenir
Profil
Zdravím,
na začátek potvrdím, že jsem s proměnnými v mysql nikdy nedělal, dokonce ani s funkcemi. Teď se ale snažím pro vyhledávání použít levensteina aby při prázdném nálezu nabídl nějaké možné překlepy.
udělal jsem si takovýto příkaz:
SET @i = 0;
SELECT jmeno, @i:=LEVENSHTEIN(jmeno,"Pokus") AS vzdalenost
FROM uzivatele
WHERE @i < 5
ORDER BY vzdalenost;

Evidentně je v něm ale něco blbě, protože když dám do podmínky 10, najde všechny uživatele, když tam dám 5, najde jen jednoho vzdáleného na 5, i když existují jiní, lepší, třeba přímo uživatele Pokus.
Prosím pěkně, poradí mi někdo, jak to opravit, aby to fungovalo?
TomášK
Profil
Nevím, v jakém pořadí se to vyhodnocuje - řekl bych, že je možné, že se nejdřív provede podmínka WHERE s @i z minulého kroku a pak teprv se do ní dosadí @i:=LEVENSHTEIN(jmeno,"Pokus"). Používáš proměnnou, tam jde není potřeba, řešil bych to takhle:
SELECT jmeno, LEVENSHTEIN(jmeno,"Pokus") AS vzdalenost
FROM uzivatele
WHERE LEVENSHTEIN(jmeno,"Pokus") < 5
ORDER BY vzdalenost;


Možná funguje i:
SELECT jmeno, LEVENSHTEIN(jmeno,"Pokus") AS vzdalenost
FROM uzivatele
WHERE vzdalenost < 5
ORDER BY vzdalenost;


Jediný důvod, proč zde použít proměnnou by mohl být ten, aby se funkce LEVENSHTEIN nepočítala zbytečně dvakrát - zřejmě není nejrychlejší. Ale tipuju, že se stejně poprvé spočítá a podruhé načte z cache - někdo zasvěcenější může mou teorii potvrdit?
Kajman_
Profil *
having @i < 5

nebo

WHERE LEVENSHTEIN(jmeno,"Pokus") < 5
igamenir
Profil
TomášK
Levenstein není zrovna nenáročná funkce, tak jsem tomu chtěl ušetřit čas, aby nevyhodnocoval jednu věc zbytečně dvakrát.
a to druhé where vzdalenost nefunguje.

Kajman_
Stejně tak nefunguje, having @i < 5 a druhé jsem nechtěl, abych šetřil.

Ale kupodivu funguje kombinace:
SELECT jmeno, LEVENSHTEIN(jmeno,"Pokus") AS vzdalenost
FROM uzivatele
HAVING vzdalenost < 5
ORDER BY vzdalenost;

takže děkuju Kajmanovi za inspiraci :) já byl vždy na tom, že having se spojuje jen s group by, ale jak je vidět, můžu to používat i jinak.
Toto téma je uzamčeno. Odpověď nelze zaslat.