Avatar billede likedon Nybegynder
08. september 2003 - 09:55 Der er 19 kommentarer og
1 løsning

Match funktion i asp

Så er der 200pt.

jeg har følgende:

SQLmatch = "select f1.filmid , count(f1.filmid) as popularity from filmkarakter f1 where ((f1.filmid <> "&filmmatch&") AND (f1.brugerid <> "&brugernr&") AND f1.karakter=6) and f1.brugerid in (Select f2.brugerid from filmkarakter f2 where (f2.filmid="&filmmatch&" AND f2.karakter=6 AND f2.brugerid <> "&brugernr&")) group by f1.filmid order by 2 desc"


Denne funktionen virker ved at jeg tager en film og matcher op mod databasen. Nu er det bare sådan at jeg skal match et ukendt antal film op mod databasen, hvordan skriver jeg funktionen om. Jeg havde prøvet med et loop, men det giver mig jo de samme film flere gange.

Nogen der har en ide?
Avatar billede eagleeye Praktikant
08. september 2003 - 10:10 #1
Ja hvordan kommer der flere  filmmatch ??

Eks hvis det er en streng med komma imellem og det er Access/MSSQL database, så kan man melig bruger IN

filmmatch = "23, 45"

SQLmatch = "select f1.filmid , count(f1.filmid) as popularity from filmkarakter f1 where ((f1.filmid not IN ("&filmmatch&")) AND (f1.brugerid <> "&brugernr&") AND f1.karakter=6) and f1.brugerid in (Select f2.brugerid from filmkarakter f2 where (f2.filmid IN ("&filmmatch&") AND f2.karakter=6 AND f2.brugerid <> "&brugernr&")) group by f1.filmid order by 2 desc"
Avatar billede eagleeye Praktikant
08. september 2003 - 10:11 #2
Alternativt skal det lave som et loop som dette:
Eks hvis det er en streng med komma imellem

str = "23, 45"
filmArr = Split(str, ",")

sWhere = ""
for i = lbound(filmArr) to ubound(filmArr)
  if sWhere <> "" then sWhere = sWhere & " OR "
  sWhere = sWhere & "((f1.filmid <> " & trim(filmArr(i)) & ") AND "
  sWhere = sWhere & "(f1.brugerid <> " & brugernr & ") AND "
  sWhere = sWhere & "f1.karakter=6) and f1.brugerid in "
  sWhere = sWhere & "(Select f2.brugerid from filmkarakter f2 where "
  sWhere = sWhere & "(f2.filmid=" & trim(filmArr(i)) & " AND f2.karakter=6 AND "
  sWhere = sWhere & " f2.brugerid <> "&brugernr&"))"
next

SQLmatch = "select f1.filmid , count(f1.filmid) as popularity from filmkarakter f1 where " & sWhere & " group by f1.filmid order by 2 desc"
Avatar billede likedon Nybegynder
08. september 2003 - 10:32 #3
filmmatch kom før fra et link, men nu skal den ned og hente de forskellige film i databasen.
Avatar billede eagleeye Praktikant
08. september 2003 - 10:37 #4
Ja men hvordan ser filmmatch ud når du kommer til din SQL sætning.
Som SQLen er i spørgsmålet skal den indeholde et tal for en film.

Når du vil hvade flere film, vil filmmatch så være en liste med tal som vist:?:
filmmatch = "23, 45"

Jeg har vist to forkellie metoder til din SQL og den begger forvendter at filmmatch vil være en komma liste:
filmmatch = "23, 45"


I sidste eks skal dette:
str = "23, 45"
filmArr = Split(str, ",")

rettes til:
filmmatch = "23, 45"
filmArr = Split(filmmatch, ",")
Avatar billede likedon Nybegynder
08. september 2003 - 10:38 #5
Den første giver mig den samme film flere gange
Avatar billede likedon Nybegynder
08. september 2003 - 10:38 #6
den ser ikke ud, det er det der skal laves om. :)
Avatar billede likedon Nybegynder
08. september 2003 - 10:39 #7
sorry det fik jeg ikke skrevet i starten.
Avatar billede likedon Nybegynder
08. september 2003 - 10:41 #8
filmmatch ligger i den samme tabel som filmid, men er adskildt på brugerid.

Altså følgende rækker:
filmid og brugerid og karakter (denne skal være lig 6)
Avatar billede likedon Nybegynder
08. september 2003 - 10:41 #9
id    filmid    karakter    brugerid
9    1    6    4
17    3    6    4
14    1    6    2
13    2    6    2
12    3    6    2
11    2    6    3
18    1    6    3
3    2    6    5
1    1    6    5
6    3    6    5
2    3    5    8
5    2    5    7
15    1    4    13
7    2    4    9
4    3    3    6
10    2    3    12
8    2    2    11
16    1    0    14
Avatar billede eagleeye Praktikant
08. september 2003 - 10:41 #10
Prøv med det i 08/09-2003 10:11:48
Avatar billede likedon Nybegynder
08. september 2003 - 10:43 #11
Den giver mig alle 3 film 2 gange

Den første var tættere på med kun 1 film 2 gange.

Det skal sige at jeg tester med brugerid=4
Avatar billede eagleeye Praktikant
08. september 2003 - 10:47 #12
Det muligvis fordi jeg ikke forstår din SQL sætning.. men prøv sådan her:

filmmatch = "23, 45"
filmArr = Split(filmmatch, ",")

sWhere = ""
for i = lbound(filmArr) to ubound(filmArr)
  if sWhere <> "" then sWhere = sWhere & " OR "
  sWhere = sWhere & "("
  sWhere = sWhere & "((f1.filmid <> " & trim(filmArr(i)) & ") AND "
  sWhere = sWhere & "(f1.brugerid <> " & brugernr & ") AND "
  sWhere = sWhere & "f1.karakter=6) and f1.brugerid in "
  sWhere = sWhere & "(Select f2.brugerid from filmkarakter f2 where "
  sWhere = sWhere & "(f2.filmid=" & trim(filmArr(i)) & " AND f2.karakter=6 AND "
  sWhere = sWhere & " f2.brugerid <> "&brugernr&"))"
  sWhere = sWhere & ")"
next
Avatar billede eagleeye Praktikant
08. september 2003 - 10:51 #13
det var kun loop'et der skulle rettes dette er det samme som før:

SQLmatch = "select f1.filmid , count(f1.filmid) as popularity from filmkarakter f1 where " & sWhere & " group by f1.filmid order by 2 desc"
Avatar billede likedon Nybegynder
08. september 2003 - 10:52 #14
Samme resultat alle 3 film 2 gange.
Avatar billede likedon Nybegynder
08. september 2003 - 10:53 #15
ikke fordi jeg fatter SQL-sætningen.
Avatar billede likedon Nybegynder
08. september 2003 - 10:54 #16
det gættede jeg men ingen ændring
Avatar billede eagleeye Praktikant
08. september 2003 - 11:01 #17
Lad os lige tage SQL'en så:
Dette
filmid <> "&filmmatch&") AND (f1.brugerid <> "&brugernr&") AND f1.karakter=6)

Gør den vil finde alle fil hvor filID er forskellig fra det man har i filmmatch og brugerID er forskellig fra brugernr og karaker = 6


Derudover er dette på:
f1.brugerid in (Select f2.brugerid from filmkarakter f2 where (f2.filmid="&filmmatch&" AND f2.karakter=6 AND f2.brugerid <> "&brugernr&"))

Det betyder; og brugerID skal være lig brugerID i record hvor (filmID=filmmatch og karakter=6 of brugerID forskellige fra brugernr)

Der er 4 film som har fået karaktere 6 på 4 forskellige brugernavn.

Hvad skal den SQL trække ud beskrevet i ord?
Avatar billede likedon Nybegynder
08. september 2003 - 11:07 #18
Krav:

Jeg skal have de "filmid" ud, som andre har set, som de har givet karakteren 6.
Men vi skal have mindst en film tilfælles, som vi begge har givet karakteren 6.

Jeg er brugerid=4 og har set film1 og film2
brugerid=2 har også set film1 og film2, men også film3, som han alle har givet karakteren 6.
Dette filmid skal jeg så have ud.


Diise filmid bruger jeg så bruger i den næste forspørgelse i et loop.
Avatar billede likedon Nybegynder
08. september 2003 - 13:26 #19
eagleeye du kan godt slappe af fandt problemmet, og det var at jeg kørte et loop med forspørgelsen og da den retunere 2 ens fandt den også 2 ens...hmm det giver ikke mening, men altså en ændring af:
If NOT (RSmatch.BOF AND RSmatch.EOF) Then
do until RSmatch.eof

til
If NOT (RSmatch.BOF AND RSmatch.EOF) Then

ser ud til at klare trikket.
Avatar billede zubmit Nybegynder
09. september 2003 - 12:43 #20
uifdiopfdsjfdsijfdsjifdsdsf
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

IT-JOB