Avatar billede roo104 Nybegynder
16. august 2003 - 14:32 Der er 9 kommentarer og
1 løsning

Søge efter flere ting i uordnet rækkefølge

Jeg har en film database, hvor jeg gerne ville kunne søge efter genre. Man skal kunne søge fx. "dr ac" og så skal den finde alle "Drama Action". Men den skal også finde alle "Action Drama", altså alle film der har action og drama som genre uanset rækkefølge.
Genre er opdelt med /. "Drama / Action / osv."

jeg har prøvet med:
SELECT * FROM film WHERE genre LIKE '%"&Replace(Replace(Request.Form("genre")," ","%"),"'","''")&"%' ORDER BY titel asc

i ASP, men den finde kun i den rækkefølge jeg søger.
Kan man ikke få den til at vælge alle ??
Avatar billede powell Nybegynder
16. august 2003 - 16:40 #1
Jeg ville nok gøre det simpelt

Dim strGenre
Dim intLoop
Dim strString

strGenre = Request.form("genre")
intLoop = 1
strString = "SELECT * FROM film WHERE genre LIKE '"
Do until intLoop = Len(strGenre)
  If inloop = 1 Then
      strChar = Left(strGenre, intLoop)
  Else
      strChar = Right(Left(strGenre, intloop), 1)
  End If
  If strChar = " " Then
      strString = strString & "%' AND genre LIKE'"
  Else
      strString = strString & strChar
  End If
Loop

strString = strString & " ORDER BY titel"

Tilsidst vil din strString være lig med den streng du har behov for at bruge i din søgning
Avatar billede powell Nybegynder
16. august 2003 - 16:41 #2
Hov jeg mangler enoget i loop'en nemlig intLoop = intLoop + 1
Avatar billede socle Nybegynder
16. august 2003 - 16:42 #3
dim sqlreq, genre, linstr, item
genre = request.form.item("genre")
genre = split(genre, " ")
linstr = " OR genre "
for each item in genre

  sqlreq = sqlreq & "LIKE '%" & item & "%'" & linstr
next
sqlreq = left(sqlreq, len(sqlreq)-len(linstr))

SELECT * FROM film WHERE genre " & sqlreq & " ORDER BY titel"
Avatar billede socle Nybegynder
16. august 2003 - 16:44 #4
evt. fjerne mellemrum, hvis der tastes flere en én:

for each item in genre

  sqlreq = sqlreq & "LIKE '%" & item & "%'" & linstr
next
Avatar billede socle Nybegynder
16. august 2003 - 16:46 #5
det her driller

evt. fjerne mellemrum, hvis der tastes flere en én:
for each item in genre
if len(trim(item)) > 0 then
  sqlreq = sqlreq & "LIKE '%" & item & "%'" & linstr
end if
next
Avatar billede socle Nybegynder
16. august 2003 - 16:53 #6
og ændre

linstr = " OR genre "

til

linstr = " AND genre "

hvis alle ord i strengen skal være til stede, og ikke kun nogle ord
Avatar billede roo104 Nybegynder
16. august 2003 - 16:57 #7
Men det må da være muligt via ren SQL, MySQL har også nogle REGEX funktioner ved jeg
Avatar billede socle Nybegynder
16. august 2003 - 16:58 #8
rettet udgave med kontrol for flere mellemrum og inkludering af alle søgeord

dim sqlreq, genre, linstr, item
genre = request.form.item("genre")
genre = split(genre, " ")
linstr = " AND genre "
for each item in genre
  if len(trim(item)) > 0 then
    sqlreq = sqlreq & "LIKE '%" & item & "%'" & linstr
  end if
next
sqlreq = left(sqlreq, len(sqlreq)-len(linstr))

SELECT * FROM film WHERE genre " & sqlreq & " ORDER BY titel"
Avatar billede roo104 Nybegynder
16. august 2003 - 18:05 #9
Brugte den her:
genre = split(Request.Form("genre"))
   
for each item in genre
    sqlGenre = sqlGenre & "AND genre LIKE '%" & item & "%'"
next

Så pointene må gå til socle
Avatar billede socle Nybegynder
16. august 2003 - 18:30 #10
mine første point! Det er godt nok stort. Mange tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester