Autor | Zpráva | ||
---|---|---|---|
igamenir Profil |
#1 · Zasláno: 29. 1. 2009, 16:22:45
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 |
#2 · Zasláno: 29. 1. 2009, 16:47:02
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 * |
#3 · Zasláno: 29. 1. 2009, 16:49:35
having @i < 5
nebo WHERE LEVENSHTEIN(jmeno,"Pokus") < 5 |
||
igamenir Profil |
#4 · Zasláno: 29. 1. 2009, 17:45:04
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. |
||
Časová prodleva: 16 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0