Hej!
Jag har ett formulär som ser ut så här:
<form method="post" action="search_match.asp" name="seachform">
<p>Fri söktext:<br>
<input type="text" name="free_search" value="" size="25"></p>
<p>Exakt sökning:<br>
Ja: <input type="radio" name="exakt" value="true"><br>
Nej: <input type="radio" name="exakt" value="false" checked></p>
<p>Sök i:<br>
<select name="search_type" size="1">
<option value="hela" selected>Hela inlägget</option>
<option value="rubrik">Bara i debattämnet</option>
</select></p>
<p>Ort:<br>
<input type="text" name="ort" value="" size="25"></p>
<p>Län:<br>
<input type="text" name="lan" value="" size="25"></p>
<p>Hundras:<br>
<input type="text" name="ras" value="" size="25"></p>
<p>Ålder:<br>
<select name="age" size="1">
<option value="" selected>Välj en ålder</option>
<option value="0-20">Upp till 20</option>
<option value="21-30">Mellan 20-30</option>
<option value="31-40">Mellan 30-40</option>
<option value="41-100">Äldre än 40</option>
</select></p>
<p>Forum:<br>
<select name="forum" size="1">
<option value="all" selected>Alla forum</option>
<option value="1">Allmänt hundforum</option>
<option value="2">Vård och skötsel</option>
<option value="3">Tävling</option>
</select></p>
<select name="SearchDate">
<option value="ALL" selected>Alla dagar</option>
<option value="1">Senaste dagen</option>
<option value="5">Senaste 5 dagarna</option>
<option value="10">Senaste 10 dagarna</option>
<option value="30">Senaste 30 dagarna</option>
<option value="60">Senaste 60 dagarna</option>
</select>
<p>Användarnamn:<br>
<input type="text" name="Username" value="" size="25"></p>
<p><input type="submit" name="submit"></p>
</form>
Som ni märker är det en rätt avancerad sökning med många valbara alternativ. SQL-frågan kan se ut på många olika sätt beroende på vad användaren har valt i formuläret.
Nu undrar jag: hur lägger man upp en dynamisk SQL-fråga på ett lämpligt sätt. Man får på något sätt kolla vilka fält som innehåller någon data och sedan anpassa WHERE i sql-frågan med en if-sats eller hur går man tillväga på smartaste sätt?
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
[Redigerat av jorgen den 10 nov 2001]
LarsGMedlem sedan dec. 200012 464 inlägg
Man får på något sätt kolla vilka fält som innehåller någon data och sedan anpassa WHERE i sql-frågan med en if-sats
Jo, så lär du få göra. Då du har ganska specifika sökvillkor i vissa fall ser jag att det är svårt att automatisera.
Du kanske skulle ha ett val som säger om man vill söka med and eller or, dvs om alla villkor skall vara uppfyllda eller om det är tillräckligt att ett villkor uppfylls.
Sen kan du fundera på hur du sorterar resultatet. Skall det vara valbart eller skall det baseras på vilka kolumner man ställer villkor på?
Om du använder fritextsökning med like '%nisse%' så kommer det inte att bli speciellt effektivt, då man inte kan utnyttja index vid sökningen.
------------------
essentitia preter non sans multiplicandum
jorgenMedlem sedan feb. 20012 412 inlägg
Jo, så lär du få göra. Då du har ganska specifika sökvillkor i vissa fall ser jag att det är svårt att automatisera.
Vilka sökvilkor tycker du är specifika?
Du kanske skulle ha ett val som säger om man vill söka med and eller or, dvs om alla villkor skall vara uppfyllda eller om det är tillräckligt att ett villkor uppfylls.
Jag hade tänkt att det var valfritt att välja vilka man vill använda. Sedan kolla med ISNULL eller något i den stilen vilka användaren har valt.
Sen kan du fundera på hur du sorterar resultatet. Skall det vara valbart eller skall det baseras på vilka kolumner man ställer villkor på?
Jag hade tänkt att man ska kunna välja i en dropdown vilket man vill sortera efter.
Om du använder fritextsökning med like '%nisse%' så kommer det inte att bli speciellt effektivt, då man inte kan utnyttja index vid sökningen.
Från början var jag inne på att använda söksyntaxen +, - och " ". Men eftersom jag inte har stöd för reg exp lade jag ner den planen.
Jag får gå och fundera lite på hur jag ska gå tillväga. Just nu verkar det vara idetorka, men ideerna brukar komma under hundpromenaderna :)
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
LarsGMedlem sedan dec. 200012 464 inlägg Det jag menade med specifika var att du har lite olika typer av villkor, ibland text, ibland numeriskt och även att det skall ligga inom ett intervall.
Min tanke med and/or var att man skulle kunna säga
Jag vill söka information där (ras = 'hardangerspets' and ort = 'mullsjö') eller
(ras = 'hardangerspets' or ort = 'mullsjö')
Isnull är väl inte så lämpligt att använda i detta sammanhang snarare
where = ""
if request.form("ort") <> "" then
if len(where) = 0 then
where = "where ort = '" & request.form("ort") & "'"
else
where = "and ort = '" & request.form("ort") & "'"
end if
end if
if request.form("ras") <> "" then
if len(where) = 0 then
where = "where ras = '" & request.form("ras") & "'"
else
where = "and ras = '" & request.form("ras") & "'"
end if
end if
'etc
Att ha stöd för +sökord och -sökord i fritextsökning har inget med regexp att göra, det är bara lite lämpliga kombinationer av like och not like och parenteser.
------------------
essentitia preter non sans multiplicandum
jorgenMedlem sedan feb. 20012 412 inlägg Hej igen,
tog fram papper och penna och började rita lite. Kan man kolla igenom formuläret och kolla vilka fält som har ett värde med:
For each objitem in Request.Form
...
...
next
Och hur gör man isåfall?
Annars lär det ju bli en ganska maffig if-sats.
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
LarsGMedlem sedan dec. 200012 464 inlägg For each objitem in Request.Form
if request.form(objItem) <> "" then
end if
next
men det blir fortfarande så att du måste göra lite olika saker beroende på vilket fält det är. Det blir nog en hel del if i alla fall.
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 10 nov 2001]
jorgenMedlem sedan feb. 20012 412 inlägg Hej,
tack för dina exempel ovan.
Att ha stöd för +sökord och -sökord i fritextsökning har inget med regexp att göra, det är bara lite lämpliga kombinationer av like och not like och parenteser.
menar du att du splittar resultatet från request.form("fritext") innan då? Min tanke med reg exp var att kolla var och hur förekomsten av + och minus.
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
LarsGMedlem sedan dec. 200012 464 inlägg Ja att du gör split med " " och sedan kollar om ett ord inleds med + eller -
men en sådan funktion låter nog som version 2.
Vad menar du med att du inte har stöd för regexp?
------------------
essentitia preter non sans multiplicandum
jorgenMedlem sedan feb. 20012 412 inlägg hej,
regexp kom i version 5 och chilliasp är bara uppe i 4.xxxx någonting. Så det dröjer nog ett tag till innan jag får stöd för det. Men å andra sidan är det bara forumet jag ska köra ASP på, pga att jag giter inte bygga ytterliggare ett nytt i JSP.
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
jorgenMedlem sedan feb. 20012 412 inlägg vad returnerar detta?
For each objitem in Request.Form
if request.form(objItem) <> "" then
end if
next
alla fältnamn som är allt annat än null eller?
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
@ndersMedlem sedan juni 200032 969 inlägg If-satsen evalueras till true om formulärfält har ett värde, dvs något ifyllt i en textruta, eller något vald i en dropdownbox.
Mvh,
------------------
All your base are belong to me.
jorgenMedlem sedan feb. 20012 412 inlägg Okey, tack snabel.
Jag får börja nysta i det och se hur långt jag kommer :)
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
jorgenMedlem sedan feb. 20012 412 inlägg Hej!
Nu har jag bestämt mig hur jag ska göra. I min medlemslista har jag lagt till en bra sorteringsfunktion där man kan sortera efter Ort, Ras, Län mm.
Och sedan i sökfunktionen kan man söka på inlägg gjort av ett speciellt användaramn eller om man vill söka i Subject eller hela meddelandet.
Hitintills har jag kommit så här långt:
Sub DoSearch
Dim RSSearch
Dim sSQL
[b]sSQL = "SELECT * FROM "[/b]
Select Case Request.QueryString("search_in")
Case "Subject"
sSQL = sSQL & "AND Subject LIKE '%" & Request.QueryString("search_text") & "%'"
Case "Messages"
sSQL = sSQL & "AND Comment LIKE '%" & Request.QueryString("search_text") & "%'"
Case "Username"
sSQL = sSQL & "AND req_Username LIKE '%" & Request.QueryString("search_text") & "%'"
Case "exact_member_name"
sSQL = sSQL & "AND AnvId = " & Request.QueryString("uid")
End Select
If Not IsBlank(Request.QueryString("ForumId")) Then sSQL = sSQL & " AND F_ID = " & Request.QueryStrin("ForumId")
sSQL = sSQL & " ORDER BY ForumName, Subject, req_Username"
Set RSSearch = objDB.Execute(sSQL)
Nu till problemet, jag har 3 tabeller som jag vill ha data ifrån. Jag har provat med diverse olika joinar, inner, right, left outer men får inte rätt på det.
Vad är det för skillnad på dessa joinar och finns det något annat sätt att gå till väga?
Jag tittade på ett annat forum hur de gjort, och de hade skrivit:
sSQL = "SELECT * " & _
" FROM Forums, Messages, Members, Topics WHERE F_ID = FORUM_ID AND R_Posted_By = M_ID AND TOPIC_ID = T_ID "
Är detta en form av fråga som mysql kan hantera?
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
[Redigerat av jorgen den 11 nov 2001]
LarsGMedlem sedan dec. 200012 464 inlägg sSQL = "SELECT * " & _
" FROM Forums, Messages, Members, Topics WHERE F_ID = FORUM_ID AND R_Posted_By = M_ID AND TOPIC_ID = T_ID "
Det är samma sak som inner join mellan tre tabell och Mysql kan hantera det.
(Jag saknar tabellnamn och where i din kod).
------------------
essentitia preter non sans multiplicandum
jorgenMedlem sedan feb. 20012 412 inlägg Okey!
Jag har tabellerna:
Inlagg:
MessId int(11)
Subject varchar(100)
dteDate
Inlagg_AnvId int(11)
IntForumId tinyint(2)
Svar:
Svar_Id int(11)
Svar_MessId int(11)
IntForumId tinyint(2)
Svar_AnvId int(11)
Svar_dteDate
Profil
AnvId int(11)
req_Username varchar(50)
Ska man ange WHERE-satsen i någon speciell ordning för att få ut uppgifterna korrekt?
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?
LarsGMedlem sedan dec. 200012 464 inlägg Ordningen har ingen betydelse.
select *
from inlagg as i ,svar as s,profil as p
where i.messid = s.svar_messid
and s.svar_anvid = p.anvid
and i.subject = 'pomenadens betydelse för kodning'
t.ex.
Jag tror (ändå, även om jag inte sagt det tidigare i just den här tråden) att du behöver union och det finns i den nya (beta-) versionen.
------------------
essentitia preter non sans multiplicandum
jorgenMedlem sedan feb. 20012 412 inlägg Hej och tack LarsG!
Det är inte det lättaste att få webhotellen att uppdatera särskilt ofta :(
mvh Jörgen :)
------------------
Varför bråka när man kan kramas?