01. august 2001 - 09:35Der er
8 kommentarer og 1 løsning
SQl søgning med procenter....
Hej alle i kloge hoveder, så er jeg stødt ind i endnu et problem.....
Jeg laver en søgning efter flere kriterier, og vil gerne have at den finder dem som har match på evt. pkt.1+2+3 men også dem der har match på pkt.2+6+4 og angiver hvor mange % de har af de søgte kriterier, min kode se således ud :
SELECT key, SUM(rank) AS rank FROM ( SELECT 8 AS rank, nakey FROM Article WHERE (rubrik LIKE \'%sid%\') UNION ALL SELECT 4 AS Rank, nakey FROM Article WHERE (urubrik LIKE \'%sid%\')) da GROUP BY nakey ORDER BY SUM(rank) DESC
Undskyld, den anden kom lidt hurtigt. Jeg har brugt en SQL der ligner denne. Den er skrevet til SQL server så den skal nok rettes lidt.
SELECT key, SUM(rank) AS rank FROM ( SELECT 8 AS rank, key FROM Article WHERE (Title LIKE \'%Test%\') UNION ALL SELECT 4 AS Rank, key FROM Article WHERE (Tekst LIKE \'%sid%\') ) da GROUP BY key ORDER BY SUM(rank) DESC
En lille forklaring... Den giver en rangeret liste over søgninger i forskellige felter, så det er ikke helt det du spørger om, men hvis du vil have den en liste med antal hits så skal du rette hhv. 8 og 4 til 1 og 1.
Set dbCon = Server.CreateObject(\"ADODB.Connection\") dbCon.open dbConnection, 1, 3 Set rs = dbCon.Execute(SQL) If rs.EOF then Response.write \"ingen records fundet\" Else Response.write \"<tr><td colspan=3 width=380>der er fundet noget</td></tr><tr><td align=center>Køn</td><td>hundens navn</td></tr>\" End if Do While Not rs.EOF Var_nu_aar = year(now) Var_test = rs(\"test\")
Måske noget i stilen med. Følgende kode vil give dig en liste over \'hunde\' (?), hvor et match på 4 giver 50 %, på 3 giver 25%, på 2 giver 12,5% og på 1 giver 6,25%. Hvis du vil have lige stor vægtning på alle søgekriterier så sæt hhv. 8,4,2 til 1 og ændre \"(cint(rs(0))\\15*100)\" til \"(cint(rs(0))\\4*100)\"
Jeg har ikke testet det så der er lidt debugging tilbage til dig ;)
SQL = \"SELECT da.Rank, User.* FROM (SELECT TOP 1000 Key, SUM(rank) AS Rank FROM (\"
SQL = SQL + \" SELECT 8 AS Rank, Key FROM User WHERE 4=\'\" & Var_4 & \"\'\"
If not request(\"3\") = \"0\" Then Var_3 = request(\"3\") SQL = SQL + \"UNION ALL SELECT 4 AS Rank, Key FROM User WHERE 3=\'\" & Var_3 & \"\'\" End If
If not request(\"2\") = \"0\" Then Var_2 = request(\"2\") SQL = SQL + \"UNION ALL SELECT 2 AS Rank, Key FROM User WHERE 2=\'\" & Var_2 & \"\'\" End If
If not request(\"1\") = \"0\" Then Var_3 = request(\"2\") SQL = SQL + \"UNION ALL SELECT 1 AS Rank, Key FROM User WHERE 1=\'\" & Var_haar_farve & \"\'\" End If
SQL = SQL + \") da GROUP BY Key) as da INNER JOIN Article ON da.Key = User.Key where Aktiv=1 ORDER BY da.Rank DESC\"
Set dbCon = Server.CreateObject(\"ADODB.Connection\") dbCon.open dbConnection, 1, 3 Set rs = dbCon.Execute(SQL) If rs.EOF then Response.write \"ingen records fundet\" Else Response.write \"<tr><td colspan=3 width=380>der er fundet noget</td></tr><tr><td align=center>Køn</td><td>hundens navn</td></tr>\" End if Do While Not rs.EOF response.write \"<tr><td>Rang =\" & (cint(rs(0))\\15*100) & \" %</td><td>Felt 1 =\" & rs(1) & \"</td><td>Felt2 =\" & rs(2) & \"</td></tr>\" wend
Jeg skal lige høre om jeg har forstået dig rigtigt.
Du har altså 1..n forskellige variable du skal søge efter i databasen. For hver observation du får ud af din søgning, skal det angives i % hvor mange af variablene der indgår i matchet.
Mao. hvis du har 3 variable i dit kriterie og kun 2 af variablene stemmer i en søgning, så skal der returneres 2/3 for den observation?
Det er jeg så godt som 100% sikker på at du ikke kan på andre måder i rent access SQL (Hvis du kan vil jeg gerne se hvordan ;)). Jeg har under alle omstændigheder ikke set dette problem løst på andre måder.
Mht. at klarer variabelt antal parametre så skal du bare lave en variabel som du opdaterer med antal tildelte points inde i if sætningen.
If not request(\"2\") = \"0\" Then MaxScore = MaxScore + 2 Var = request(\"2\") SQL = SQL + \"UNION ALL SELECT 1 AS Rank, Key FROM User WHERE 2=\'\" & Var & \"\'\" End If
og i din udskrivning skal du ændre (cint(rs(0))\\15*100) til (cint(rs(0))\\MaxScore*100), som vil give dig resultatet i %.
Den untimative måde at lave en rangeret liste er at bruge Full Text Index men den kører kun på SQL serveren, men også her er der problemer med at få en nøjaktig % angivelse.
Synes godt om
Ny brugerNybegynder
Din løsning...
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.