webForumDet fria alternativet

Avancerad sökning

16 svar · 323 visningar · startad av Jörgen HP

Jörgen HPMedlem sedan feb. 20012 412 inlägg
#1

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
#2

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
#3

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
#4

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
#5

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
#6
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
#7

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
#8

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
#9

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
#10

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
#11

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
#12

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
#13

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
#14
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
#15

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
#16

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
#17

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?

145 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)