Välkommen hit Dudde!
Ditt problem låter intressant, men jag skulle gärna vilja att du förklarade det lite mer, innan jag sätter tänderna i det. Ett mer reellt exempel, liksom.... :)
5 svar · 250 visningar · startad av Dudde
Hej!
Jag sitter och klurar på en nöt jag inte riktigt kommer på...
Jag ska göra en sökfunktion till följande:
En massa val (properties) från ett formulär sparas i en databas...(textinput, dropdown-val, radiobutton)...
Valen lagras som sagt i en databas. (Hur basen ser ut är inte bestämt ännu.)
Söknings-formuläret kommer att se liknande ut som formuläret med (properties)...
I sökningsformuläret skall man kunna välja en vikt på varje fråga...
Dvs. 1-5 (radio-buttons) där 1 betyder att frågan inte har så stor betydelse och 5 att frågan är viktig...
Sedan skall matchningen gå till så att om många alternativ stämmer med (properties)-basen kommer de med, sortering på summan av vikterna!
Tanke 1:
Om man spar de sökta alternativen i en databas och sedan kör en sql-fråga på baserna "relaterade"..Hur skulle den kunna se ut?
Tanke 2:
Man kör flera sql och kollar varje val för sig...Känns lite lågt?
Tanke 3:
Någon som har en idé?
Hoppas Ni har några kommentarer, ideér, gärna kodsnuttar alt. sql-uttryck från liknande kompositioner...
Hoppas på svar!
/Dudde.
Välkommen hit Dudde!
Ditt problem låter intressant, men jag skulle gärna vilja att du förklarade det lite mer, innan jag sätter tänderna i det. Ett mer reellt exempel, liksom.... :)
Ett uppkast
Jag tänker att man har en tabell (properties) där man lagrar vilka egenskaper ett objekt har. Den har kolumnerna
pid propertyName propertyValue
där pid är vilket objekt det gäller för.
När du vill göra en matchning så tänker jag mig att man lägger in de sökta egenskaperna i en annan tabell (searchers) som har kolumnerna
sid propertyName minV maxV weight
minV och maxV är till för att hantera om man vill söka inom ett intervall t.ex mellan 80 och 90 kg. Om man har ett diskret värde så lägger man det i både minV och maxV. Weight är en siffra som anger hur viktigt det är att egenskapen matchar. Exakt hur man väljer detta värde får man nog prova sig fram till.
För att ta fram hur bra något matchar kan man då göra följande select
select pid, sum(weight) as matchRate
from properties p, searchers s
where p.propertyName = s.propertyName
and p.propertyValue between s.minV and s.maxV
group by pid
order by matchRate
Alltså desto fler matchningar desto högre summa. Det här är inte något som jag har gjort i något sammanhang så jag vet inte hur effektivt det blir om man har stora datamängder.
Om man vill att några egenskaper måste gälla så kan man ju vikta dom väldigt högt.
------------------
essentitia preter non sans multiplicandum
LarsG:s inlägg är en intressant metod..
Dock blir det lite jobbigt när varje val i formuläret måste en egen post...
Det skulle bli enormt med poster om man tänker sig 40-50 val i properties-databasen multiplicerat med antalet ID:n.
Jag tänkte mig kanske att baka ihop alla valen från properties-formuläret till en enda sträng och sedan kasta in i basen. Sen söka i strängen.
Eller köra relaterat mellan baserna med varje val i en kolumn...Men då blir viktningen knepig...
Eller?
/Dudde
LarsGs variant är bra. Att baka in allt i en sträng vore verkligen att skjuta sig i foten.
Jo det känns inte riktigt rätt...
Och jo det känns klart bättre med LarsG:s variant...
För övrigt mkt trevligt forum!
/Dudde