Avatar billede wolfgang Praktikant
11. april 2006 - 15:41 Der er 5 kommentarer og
1 løsning

Konstruktion af advanceret SQLstreng - søgefunktion

Hej Eksperter,
I forbindelse med en søgefunktion (SQL-streng), har jeg brug for jeres hjælp.
- Se eksisterene SQL nederst.

Jeg har en udvidet søgefunktion, der giver brugeren mulighed for at søge på flere ord (indsnævrene søgning).
Brugeren indtaster flere ord, adskilt af "+" i søgefeltet.

Der søges i en tabel (tbl_cv_data). Denne tabel kan indholde flere poster, der relaterer til den samme bruger i systemet.

Som det er nu virker min kode 50%. Min kode kan kun finde noget hvis alle angive søgeord, er i samme database-post.
Jeg kan desværre ikke se mig ud af at få udvidet den eksisterende kode.


-------------- KODE --------------
dim arrWords
arrWords = split(varExtSearchCriteria,"+")
   
strSQL1 =     "select distinct userID, "&_
        "(select workArea from tbl_user_workarea where tbl_user_workarea.workAreaID = (select workAreaID from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID))as uworkArea, " & _
        "(select userPicture from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uPicture, " & _
        "(select userFName from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uFName, " & _
        "(select userLName from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uLName, " & _
        "(select userJobtitle from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uJobtitle, " & _
        "(select showUserEmail from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as showUserEmail, " & _
        "(select userEmail from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uEmail, " & _
        "(select userPhone from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uPhone " & _
        "from tbl_cv_data where "

        arrESC=Split(varExtSearchCriteria,"+")
            strSQL1= strSQL1 & " "
                for i=lBound(arrESC) to uBound(arrESC)
                    if i>lBound(arrESC) then
                    strSQL1=strSQL1 & " and "
                    end if
                strSQL1=strSQL1 & " dataEntry like '%" & arrESC(i) & "%' "
                next
                strSQL1= strSQL1 & " and userID=(select userID from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID and active=1 and userLevel<>112) "
               
Set rsExtSearch = Connect.Execute(strSQL1)

Jeg glæder mig til at høre fra jer.

MVH /Henrik
Avatar billede softspot Forsker
11. april 2006 - 16:10 #1
Jeg kan ikke helt gennemskue hvad du vil, kan du uddybe lidt mere?

Desuden spekulerer jeg på om du ikke kan klare dig med nogle joins i stedet for alle de subqueries (mange opslag i samme tabel bare efter forskellige felter, må iflg. min opfattelse, gøre forspørgslen langsommere).
Avatar billede wolfgang Praktikant
12. april 2006 - 09:09 #2
Hej, Jeg prøver lige at beskrive problemet lidt bedre.

Tabellen tbl_cv_data indholder felterne:
userID = ref. personens brugerid i systemet
dataEntry = Dataindtastning (Det er her der skal søges)

En bruger (userID) kan sagtens have flere poster/indtastninger i tbl_cv_data.

Eksempel: Person1 har 4 indtastning i tabellen. Hvis der f.eks søges på "it+idræt" finder den kun Person1 hvis de 2 søgte ord, er indtastet i samme post. Hvis de 2 ord er fordelt i 2 indtastninger er resultatet nul.

Det skulle gerne være således at der søges i alle poster, efter alle søgeord.

Mht. din kommentar onkring Joins vs. Sub-selects, vil jeg da gerne høre nærmere.
- Jeg har desværre aldrig fået mig sat ind i brug af Joins :(

MVH /Henrik
Avatar billede softspot Forsker
12. april 2006 - 10:03 #3
Såvidt jeg kan forstå på dit oplæg, så skal du bruge OR i stedet for AND. OR-operatoren finder posten hvis enten den ene eller det anden betingelse er opfyldt, med AND-operatoren skal alle betingelser være opfyldt.

Dvs. flg. løkke skal ændres en anelse:

  arrESC=Split(varExtSearchCriteria,"+")
  strSQL1= strSQL1 & " "
  for i=lBound(arrESC) to uBound(arrESC)
    if i>lBound(arrESC) then
      strSQL1=strSQL1 & " and "
    end if
    strSQL1=strSQL1 & " dataEntry like '%" & arrESC(i) & "%' "
  next

til (jeg har tillad mig at fjerne lbound, da arrays fundet via split altid starter ved index 0):

  arrESC=Split(varExtSearchCriteria,"+")
  strSQL1= strSQL1 & " "
  if ubound(arrESC) >= 0 then
    strSQL1=strSQL1 & "("
    for i=0 to uBound(arrESC)
      if i > 0 then
        strSQL1=strSQL1 & " or "
      end if
      strSQL1=strSQL1 & " dataEntry like '%" & arrESC(i) & "%' "
    next
    strSQL1=strSQL1 & ") "
  end if

ud over at ændre AND til OR, så er det nødvendigt at sætte parantes omkring alle OR-betingelserne, så de evalueres samlet og ikke påvirkes af den sidste AND-betingelse (AND har præcedens over OR og vil derfor evaluere først, hvilket ville betyde at userid ikke altid ville få en betydning for om en post blev medtaget - hvilket den jo SKAL)...

Hvad angår JOIN, så lad den lige ligge i første omgang og se om dette ikke fungerer (eller om jeg har misforstået dit behov).
Avatar billede wolfgang Praktikant
13. april 2006 - 13:08 #4
Hej, Beklager ventetiden.
Jeg har lige testet dit forslag af og det giver desværre ikke det ønskede resultat.

Søgerutinen kan ikke finde personen hvis der søges på (f.eks) 2 ord, der befinder sig i hver sin record.

For en god ordens skyld, har er her min tilrettede kode (den kan jo være mig, der har lavet en fejl.)

dim arrWords
    arrWords = split(varExtSearchCriteria,"+")
   
    strSQL1 =     "select distinct userID, "&_
                "(select workArea from tbl_user_workarea where tbl_user_workarea.workAreaID = (select workAreaID from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID))as uworkArea, " & _
                "(select userPicture from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uPicture, " & _
                "(select userFName from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uFName, " & _
                "(select userLName from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uLName, " & _
                "(select userJobtitle from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uJobtitle, " & _
                "(select showUserEmail from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as showUserEmail, " & _
                "(select userEmail from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uEmail, " & _
                "(select userPhone from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID)as uPhone " & _
                "from tbl_cv_data where "


                arrESC=Split(varExtSearchCriteria,"+")
                    strSQL1= strSQL1 & " "
                      if ubound(arrESC) >= 0 then
                    strSQL1=strSQL1 & "("
                        for i=0 to uBound(arrESC)
                          if i > 0 then
                            strSQL1=strSQL1 & " or "
                          end if
                    strSQL1=strSQL1 & " dataEntry like '%" & arrESC(i) & "%' "
                    next
                    strSQL1=strSQL1 & ") "
                  end if
        strSQL1= strSQL1 & " and userID=(select userID from tbl_user_data where tbl_user_data.userID=tbl_cv_data.userID and active=1 and userLevel<>112) "
Avatar billede wolfgang Praktikant
19. april 2006 - 11:26 #5
Hej SoftSpot, Jeg tror det er tid til at arbejde med en alternativ løsning.
- Du skrev noget om brug af join.

Er det muligt at joine alle felterne [dataEntry] grupperet efter [userID] og derefter sende det igennem søgerutinen?

Vil man så ikke ende op med et stort "virtuelt/alias" felt pr. [userID], der indeholder data fra felter [dataEntry] der tilhøre det givne [userID]?

Håber at ovenstående giver mening :)

MVH / Henrik
Avatar billede wolfgang Praktikant
14. juli 2011 - 14:24 #6
Lukket...
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
Kurser inden for grundlæggende programmering

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