seperer din query på alle seperatortegn (komma, space, bindestreg m.v.) og lig disse ind i et array... din sql laver du så hvor ord er like %query% hvor quert er det enkelte ord... lav det som en OR søgning.
Okaaay..... hmmm.... Jeg har følgende linie i min sqlstreng: strSQL = strSQL & \" AND (VARENAVN = \'\" & strKEYWORD & \"\' OR VAREBESKRIVELSE LIKE \'%\" & strKEYWORD & \"%\')\"
Hvor strKEYWORD er søgeordet hentet fra søgeformen! Men hvordan deler jeg det op hvis der er indtastet 2 ord i søgeformen? Skal lige siges, at strKEYWORD skal være ligmed VARENAVN og kun LIKE VAREBESKRIVELSE - altså dvs. at de 2 ord som brugeren indtaster skal køre igennem både VARENAVN og VAREBESKRIVELSE kolonnerne!
ljweb >> du undergraver jo ditt eget svar tidligere med bruk av OR ;) men det er en detalj...
wermelin >> det som du bør være oppmerksom på er at ljweb sin sql søker på alle entries som inneholder ordet \'sko\' eller \'nike\' noe som vil gi deg en hel masse treff enn hvis du søker uten wildcard (lik mitt svar)...du kan benytte wildcards på denne måte også:
\'%sko\' --> alle ord som slutter med \'sko\' \'sko%\' --> alle ord som starter med \'sko\'
nute >> jeg opdagede min fejl... selvfølgelig skal den søge AND og ikke OR... jeg er lidt miljøskadet efter min seneste søgning der netop skulle bruge OR...
wermelin >> jeg er ikke hjemme i ASP... i PHP vil jeg bruge explode kommandoen :)))) *gg*
\' Her kommer SQLstrengen! strSQL = \"SELECT * FROM VARE WHERE\" IF strAMTKEYWORD = \"ALLE\" THEN strSQL = strSQL & \" AMT LIKE \'%amt%\'\" ELSE strSQL = strSQL & \" AMT = \'\" & strAMTKEYWORD & \"\'\" END IF . . . strSQL = strSQL & \" AND (VARENAVN = \'\" & arrWords & \"\' OR VAREBESKRIVELSE LIKE \'%\" & arrWords & \"%\')\"
if len( arrWords ) >= 1 then strSQL = \"...WHERE VARENAVN LIKE \'\" & arrWords(1) & \"\'\" for i = 2 to len(arrWords) strSQL = strSQL & \" OR VARENAVN LIKE \'\" & arrWords(i) & \"\'\" next end if
hvis dette ikke fungerer, skriv ut din sql streng så vi kan se hvordan den ser ut...
Koden nu: DIM arrWords arrWords = split( strKEYWORD,\"+\")
\' Her kommer SQLstrengen! strSQL = \"SELECT * FROM VARE WHERE\" IF strAMTKEYWORD = \"ALLE\" THEN strSQL = strSQL & \" AMT LIKE \'%amt%\'\" ELSE strSQL = strSQL & \" AMT = \'\" & strAMTKEYWORD & \"\'\" END IF . . . . IF UBOUND(arrWords) >= 1 THEN strSQL = strSQL & \" AND (VARENAVN = \'\" & arrWords(1) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & arrWords(1) & \"%\')\" FOR i = 2 TO UBOUND(arrWords) strSQL = strSQL & \" AND (VARENAVN = \'\" & arrWords(i) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & arrWords(i) & \"%\')\" NEXT END IF
Men nu kører den ikke løkken igennem... strSQL = SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53
Hmm.... nu sådan: SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN AND \' nike\' OR VAREBESKRIVELSE LIKE \'% nike%\')
AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\')
skal være:
AND (BY LIKE \'%a%\' OR BY LIKE \'%e%\' OR BY LIKE \'%i%\' OR BY LIKE \'%o%\' OR BY LIKE \'%u%\' OR BY LIKE \'%ø%\' OR BY LIKE \'%æ%\' OR BY LIKE \'%å%\')
(( personlig synes jeg den er litt \"latterlig\" for den vil jo returnere *alle* byene som inneholder minst én av disse bokstavene ))
IF UBOUND(arrWords) >= 1 THEN strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(1)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(1)) & \"%\')\" FOR i = 2 TO UBOUND(arrWords) strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\')\" NEXT END IF
Hmm..... nu har jeg skrevet \'sko+tennissokker\' og får denne sql; SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN = \'tennissokker\' OR VAREBESKRIVELSE LIKE \'%tennissokker%\')
Dvs. at den KUN søger på alt efter +\'et.. hmm...?!?
normalt vil jo en søkemaskin fungere sånn at når man skriver
sko+nike
så vil den søke etter alle entries som har nøyaktig strengen
skriver man
sko AND nike
så vil den søke etter alle entries som har begge ord
skriver man fx
sko nike
så vil man søke etter alle entries som inneholder begge ord...
det er ikke bare å lage en søkemaskin og tilleffe den en hel masse funksjonalitet....det krever en hel del filtrering av søkeordene, pluss at man skal validere søkestrengen opp mot en hel del regler som man har definert....
Men hvis jeg siger at jeg vil have det sådan at når man søger på \'sko\' og \'nike\' - så skal den søge igennem med \'sko\' i VARENAVN og VAREBESKRIVELSE og udskrive alle poster der indeholder \'sko\'. Bagefter skal den tage \'nike\' og gøre nøjagtigt det samme. Dvs. at brugeren får alle poster der indeholder ordet \'sko\' og eller poster der indeholder ordet \'nike\'!
Hvilken seperator skal jeg så bruge: +, AND, (mellemrum!) eller en helt tredje??
for å gjøre det enkelt, ville jeg bare tillate å søke på
\'sko nike\' UTEN \'AND\', \'OR\', \'+\' eller noe annet...deretter splitter du bare din søkestreng på mellomrom:
Dim arrWords = split( strKEYWORD,\" \" )
din loop skal faktisk se sånn ut:
arrLenght = UBOUND(arrWords) IF arrLenght >= 1 THEN strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(1)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(1)) & \"%\' \" IF arrLenght <= 1 THEN strSQL = strSQL & \")\" ELSE FOR i = 2 TO UBOUND(arrWords) strSQL = strSQL & \" OR VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\'\" NEXT IF i = arrLength THEN strSQL = strSQL & \")\" END IF END IF END IF
nute>> Undskyld jeg ikke har svaret dig - men har lige været til frokost! Jeg har prøvet at sætte din kode ind - og den fungerer uden fejl, og dog.... .. for når jeg søger på \'sko nike\' - bruger den KUN \'nike\' som søgeord - og ikke \'sko\'. Se her: SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN = \'nike\' OR VAREBESKRIVELSE LIKE \'%nike%\' ) Hvorfor gør den kun det??
Og hvis jeg kun skriver \'sko\' (altså kun 1 ord som søgeord!) så søger den slet ikke efter søgeordet. Se her: SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 Hvorfor det?
Jeg har lavet lidt om: arrLenght = UBOUND(arrWords) Response.write \"<br><br><br>\" response.write \"--> \" & UBOUND(arrWords) IF arrLenght >= 0 THEN strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\') \" IF arrLenght <= 1 THEN strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(1)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(1)) & \"%\') \" ELSE FOR i = 2 TO UBOUND(arrWords) strSQL = strSQL & \" OR VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\'\" NEXT IF i = arrLength THEN strSQL = strSQL & \")\" END IF END IF END IF
Og når jeg søger på \'sko nike\' får jeg rigtigt resultat og sql\'en ser sådan ud men - men respons.write arrLenght er stadigvæk 1: --> 1
SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN = \'sko\' OR VAREBESKRIVELSE LIKE \'%sko%\') AND (VARENAVN = \'nike\' OR VAREBESKRIVELSE LIKE \'%nike%\')
Når jeg så kun søger på 1 ord får jeg en fejl: Indekset er uden for området: \'[number: 1]\'
Men uanset hvordan vi skriver det - så må fejlen jo være her DIM arrWords arrWords = split( strKEYWORD,\" \") et sted - for det er som om at den ikke kan tælle at der er mere end 1 ord.... eller hva\'?
Array starter på 0 - dvs. 1 søgeord = 0 og 2 søgeord = 1 osv osv.
Jeg har forkortet koden lidt så nu ser den sådan ud - og den virker! :O) arrLenght = UBOUND(arrWords) IF arrLenght = 0 THEN strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\') \" ELSE FOR i = 0 TO UBOUND(arrWords) strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\') \" NEXT IF i = arrLength THEN strSQL = strSQL & \")\" END IF END IF
Heh... der en lille bug! Hvis jeg fx. søger på 2 ord som KUN findes i VARENAVN kolonnen fx. \'sko tennissokker\' så får jeg følgende sqlstreng:
SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND (POSTNR BETWEEN 100 AND 10000) AND (UGE BETWEEN 0 AND 53) AND (VARENAVN = \'sko\' OR VAREBESKRIVELSE LIKE \'%sko%\') AND (VARENAVN = \'tennissokker\' OR VAREBESKRIVELSE LIKE \'%tennissokker%\')
Og min egen streng: Søgningen på \'sko tennissokker\' gav intet resultat!
Men sqlstrengen ser da rigtig ud ikke! Den burde tage alle poster med VARENAVN=sko og alle poster med VARENAVN=tennissokker ikke??
arrLenght = UBOUND(arrWords) IF arrLenght = 0 THEN strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\') \" ELSE strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\'\" FOR i = 0 TO UBOUND(arrWords) strSQL = strSQL & \" OR (VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\' \" NEXT IF i = arrLength THEN strSQL = strSQL & \")\" END IF END IF
dessuten bør du lese min posting klokken 07/03 2001 11:38:34
Heh.. den med BY osv... Ja, det er også meningen at den skal retunere ALLE byerne :o) Brugeren kan enten vælge en specifik by eller valgmuliheden --ALLE BYER -- og så for at få alle byerne med, så tog jeg bare vokalerne - for der findes jo mindst én vokal i et ord :o)
Og den nye kode du kom med - virkede; jeg skulle dog fjerne NEXT IF i = arrLength THEN strSQL = strSQL & \")\" END IF og tilføje en ) på de andre linie :o)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.