11. april 2006 - 15:41Der 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) "
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).
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 :(
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).
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) "
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.