Hej. Jag har gjort en sökmotor som tar emot från flera inputfält. Alltså, man kan antingen fylla i alla eller bara de man känner för när man vill göra en sökning. Såhär ser den ut. Jag föreslår: En sätt att optimera det hela är att helt bygga upp sql-satsen beroende på om användaren fylt i villkor eller inte. Om personen lämnar ett fält tomt söker du på det i alla fall ock eftersom du har uttrycket like '%%' så blir det en ganska stor belastning. Tack till både Andreas och M. Sand. Detta verkar vara lösningen på mitt problem. Skall prova detta. Det finns ett smart sätt och det finns ett annat sätt. Man kan kolla om det finns ett tidigare vilkor och i så fall lägga till ett och vilkor, som M. Sand sa:Hjälp med sök-sqlfråga
<code>
sql = " select * from foretag f "
sql = sql & " join bransch b on b.bransch_id = f.bransch_id "
sql = sql & " join lan l on l.lan_id = f.lan_id "
sql = sql & " join kommun k on k.kommun_id = f.kommun_id "
sql = sql & " where foretags_namn like '%"&Request.Form("foretagsnamn")&"%' "
sql = sql & " and kommun like '%"&Request.Form("kommun")&"%' "
sql = sql & " and lan like '%"&Request.Form("lan")&"%' "
sql = sql & " and bransch like '%"&Request.Form("bransch")&"%' "
sql = sql & " and foretags_sokord like '%"&Request.Form("sokord")&"%' "
sql = sql & " order by foretags_namn asc "
</code>
Detta funkar fint.
Grejen är att det sista inputfältet i sökformuläret heter "Valfritt sökord" vilket nu motsvarar den näst sista raden "and foretags_sokord like...".
Just nu söker ju det bara i "foretags_sokord". Jag vill ju såklart att "Valfritt sökord" skall söka i alla de andra fälten också, just därför att man skall kunna skriva vad som helst där.
Har provat med
<code>
sql = sql & " and foretags_sokord like '%"&Request.Form("sokord")&"%' or foretags_namn like '%"&Request.Form("sokord")&"%' or foretags_bransch like '%"&Request.Form("sokord")&"%' " osv....
</code>
Ja, massa "or". Men då får man inte längre några vettiga träffar. Hur skall man bära sig åt för att greja detta, någon som har erfarenhet?
Kanske skall man bygga sökmotorn på något annat sätt? Sökte som en galning på artiklar om detta, men kammade noll..
Mvh//RobertSv: Hjälp med sök-sqlfråga
<code>
Dim strSQL
Dim strWhere
If Len(Request.Form("foretagsnamn")) > 0 Then
strWhere = strWhere & " AND foretags_namn like '%" & Request.Form("foretagsnamn") & "%'"
End If
If Len(Request.Form("kommun")) > 0 Then
strWhere = strWhere & " AND kommun like '%" & Request.Form("kommun") & "%'"
End If
If Len(Request.Form("lan")) > 0 Then
strWhere = strWhere & " AND lan like '%" & Request.Form("lan") & "%'"
End If
If Len(Request.Form("bransch")) > 0 Then
strWhere = strWhere & " AND bransch like '%" & Request.Form("bransch") & "%'"
End If
If Len(Request.Form("sokord")) > 0 Then
strWhere = strWhere & " AND (foretags_sokord like '%" & Request.Form("sokord") & "%' OR " & _
"foretags_namn like '%" & Request.Form("sokord") & "%' OR" & _
"kommun like '%" & Request.Form("sokord") & "%' OR" & _
"lan like '%" & Request.Form("sokord") & "%' OR" & _
"bransch like '%" & Request.Form("sokord") & "%')"
End If
If Len(strWhere) > 0 Then
strSQL = "SELECT *" & vbCrLf & _
"FROM foretag f JOIN" & vbCrLf & _
" bransch b ON b.bransch_id = f.bransch_id JOIN" & vbCrLf & _
" lan l ON l.lan_id = f.lan_id JOIN" & vbCrLf & _
" kommun k ON k.kommun_id = f.kommun_id" & vbCrLf & _
"WHERE " & Mid(strWhere, 5) & vbCrLf & _
"ORDER BY foretags_namn ASC"
Else
strSQL = "SELECT *" & vbCrLf & _
"FROM foretag f JOIN" & vbCrLf & _
" bransch b ON b.bransch_id = f.bransch_id JOIN" & vbCrLf & _
" lan l ON l.lan_id = f.lan_id JOIN" & vbCrLf & _
" kommun k ON k.kommun_id = f.kommun_id" & vbCrLf & _
"ORDER BY foretags_namn ASC"
End If
</code>Sv: Hjälp med sök-sqlfråga
Låt servern ta hand om det som du brukar, genom att inte ta med villkoret om fältet är tomt.
<code>
sql = "SELECT * FROM Kunder WHERE "
if txtKundNR.text <> "" then
if where = "" then
where = "kundnr like '%" & txtKundNr & "%'
else
where = " AND kundnr like '%" & txtKundNr & "%'
end if
end if
[...]
sql = sql & where
</code>
Du bygger alltså dynamiskt upp din wheresats. Om du dessutom behöver olika joins så kan du bygga upp dem dynamiskt också.
//Mikael.NETSv: Hjälp med sök-sqlfråga
RobertSv: Hjälp med sök-sqlfråga
<code>
Hej igen. Det funkar bra, men Andreas, jag undrar lite över denna koden:
& Mid(strWhere, 5) &
Den ligger precis i början av where. Vad gör den exakt i detta exemplet?
Robert
</code>Sv: Hjälp med sök-sqlfråga
<code>
If Len(strWhere) Then
strWhere = strWhere & " AND KundNr like '%" & txtKundNr & "%'
Else
strWhere = "KundNr like '%" & txtKundNr & "%'
End if
If Len(strWhere) Then
strWhere = strWhere & " AND KundNamn like '%" & txtKundNamn & "%'
Else
strWhere = "KundNr like '%" & txtKundNamn & "%'
End if
If Len(strWhere) Then
strWhere = strWhere & " AND KundAdress like '%" & txtKundAdress & "%'
Else
strWhere = "KundAdress like '%" & txtKundAdress & "%'
End if
</code>
Eller så är man smart. Lägger ett And framför alla vilkor och ta bort det första:
<code>
strWhere = strWhere & " AND KundNr like '%" & txtKundNr & "%'
strWhere = strWhere & " AND KundNamn like '%" & txtKundNamn & "%'
strWhere = strWhere & " AND KundAdress like '%" & txtKundAdress & "%'
strWhere = Mid$(strWhere, 5)
</code>
Så slipper man göra en jämförelse för varje vilkor.