Avatar billede bongi Juniormester
01. august 2001 - 09:35 Der 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 :

   
    dbConnection = \"DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=\" & Server.MapPath(\"../../db/system.mdb\")
    Var_4 = request(\"soeger\")
    Var_aktiv = \"1\"
    SQL = \"SELECT * FROM users WHERE aktiv=\'\" & Var_aktiv & \"\'\"
       

    Var_4 = request(\"4\")
    SQL = SQL + \" AND 4=\'\" & Var_4 & \"\'\"

   
    If not request(\"3\") = \"0\" Then
    Var_3 = request(\"3\")
    SQL = SQL + \" AND 3=\'\" & Var_3 & \"\'\"
    End If
   
    If not request(\"1\") = \"0\" Then
    Var_1= request(\"1\")
    SQL = SQL + \" AND 1 =\'\" & Var_haar_farve & \"\'\"
    End If
   
    If not request(\"2\") = \"0\" Then
    Var_2 = request(\"2\")
    SQL = SQL + \" AND 2=\'\" & Var_2& \"\'\"
    End If
Avatar billede bongi Juniormester
01. august 2001 - 09:35 #1
osv.....
Avatar billede oswald Nybegynder
01. august 2001 - 09:53 #2
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
Avatar billede oswald Nybegynder
01. august 2001 - 09:56 #3
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
Avatar billede oswald Nybegynder
01. august 2001 - 09:58 #4
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.
Avatar billede bongi Juniormester
01. august 2001 - 10:00 #5
Hmmm der stod jeg sq af....

hvordan får man så % ud for hver enkelt record ??

kunne du prøve at skrive det ind i min kode ?

her er resten :

    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&oslash;n</td><td>hundens navn</td></tr>\"
        End if
        Do While Not rs.EOF
        Var_nu_aar = year(now)
        Var_test = rs(\"test\")
Avatar billede oswald Nybegynder
01. august 2001 - 11:43 #6
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&oslash;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

Avatar billede zeptic Nybegynder
01. august 2001 - 11:47 #7
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?

Avatar billede bongi Juniormester
02. august 2001 - 07:34 #8
Oswald -> Ja men jeg har ca 20 forskellige  kriterier....

Den skal retunere alle, men ud for hver post angive hvor mange af de angivne søgekriterier der er opfyldt (helst i %)

Antallet af søgekriterier kan ændre sig alt efter hvilken type der søges efter...
Avatar billede oswald Nybegynder
02. august 2001 - 10:22 #9
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester