Avatar billede tzag_dk Nybegynder
20. maj 2004 - 18:12 Der er 39 kommentarer og
1 løsning

topliste + enkelt placering

Hej

Jeg skulle gerne have lavet en topliste hvor der vælges fra 2 tabeller.
Jeg har en tabel med hotbilleder og en tabel med hotstemmer.

Det er ikke noget problem at få 25 poster ud fra hotbilleder samt at vise scoret til billedet.
Problemet ligger i at jeg kan ikke få soteret efter den højeste score, samt at man skal have min. 20 stemmer for at komme på toplisten.
Det er det samme princip som her: http://www.hotpeople.dk/toplists.asp

Mine 2 tabeller ser sådan her ud...
---hotbilleder---
id--profilerID--godkendt--billede--
56--1-----------1---------56.jpg---

---hotstemmer--
id--hotbillederID--profilerID--point--
132-56-------------1-----------6------

Den måde tabellerne realler til hinanden er:
hotbilleder.id = hotstemmer.hotbillederID

Kan I følge hvad det er jeg vil?
På forhånd tak :-)
// Rene
Avatar billede tzag_dk Nybegynder
20. maj 2004 - 18:14 #1
Forresten, er der også nogle der ved hvordan man laver én placering for et billede, uden at skulle på toplisten?
Og databaseb er en MySQL :-)
Avatar billede avlund Nybegynder
20. maj 2004 - 18:34 #2
Mit SQL er vist lidt rustent, og der skal nok rettes i det her, men det kan være et udgangspunkt:

SELECT hotbilleder.id, billede, hotbilleder.profilerID FROM hotbilleder LEFT JOIN hotstemmer ON hotstemmer.hotbillederID = hotbilleder.id WHERE COUNT( DISTINCT hotstemmer.id ) => 20 ORDER BY AVG( point )
Avatar billede tzag_dk Nybegynder
20. maj 2004 - 18:41 #3
Den laver denne fejl:

[TCX][MyODBC]Forkert brug af grupperings-funktion
Avatar billede avlund Nybegynder
21. maj 2004 - 10:21 #4
Hvad så med...

SELECT COUNT( DISTINCT hotstemmer.id ) AS cnt, hotbilleder.id, billede, hotbilleder.profilerID FROM hotbilleder LEFT JOIN hotstemmer ON hotstemmer.hotbillederID = hotbilleder.id WHERE cnt => 20 ORDER BY AVG( point )
Avatar billede tzag_dk Nybegynder
21. maj 2004 - 13:14 #5
Den laver bare samme fejl igen :-(

[TCX][MyODBC]Forkert brug af grupperings-funktion
Avatar billede avlund Nybegynder
21. maj 2004 - 17:37 #6
SELECT COUNT( DISTINCT hotstemmer.id ) AS cnt, hotbilleder.id, billede, hotbilleder.profilerID FROM hotbilleder LEFT JOIN hotstemmer ON hotstemmer.hotbillederID = hotbilleder.id WHERE cnt => 20 ORDER BY AVG( point ) GROUP BY hotbilleder.profilerID

?
Avatar billede tzag_dk Nybegynder
21. maj 2004 - 18:08 #7
Det var underligt...!!?!
Nu laver den ikke den anden fejl, men kommer med denne her:

[TCX][MyODBC]Der er en fejl i SQL syntaksen nær 'GROUP BY hotbilleder.profilerID' på linje 1
Avatar billede avlund Nybegynder
21. maj 2004 - 19:32 #8
Har du det online lige nu?
Avatar billede tzag_dk Nybegynder
21. maj 2004 - 19:37 #9
Ja, du kan se det her:

http://www.spotpeople.dk/toplister/
Avatar billede avlund Nybegynder
21. maj 2004 - 20:18 #10
Nåja, selvfølgelig. Der skal byttes om på ORDER BY og GROUP BY:

SELECT COUNT( DISTINCT hotstemmer.id ) AS cnt, hotbilleder.id, billede, hotbilleder.profilerID FROM hotbilleder LEFT JOIN hotstemmer ON hotstemmer.hotbillederID = hotbilleder.id WHERE cnt => 20 GROUP BY hotbilleder.profilerID ORDER BY AVG( point )
Avatar billede tzag_dk Nybegynder
21. maj 2004 - 20:22 #11
Heller ikke... :-(

[TCX][MyODBC]Forkert brug af grupperings-funktion
Avatar billede avlund Nybegynder
21. maj 2004 - 20:40 #12
God damnit!

Er på vej ud her nu om lidt, men jeg vil prøve at kigge på det i morgen. Det skal kunne lade sig gøre.
Avatar billede tzag_dk Nybegynder
21. maj 2004 - 20:41 #13
Tak for det... Jeg sidder lige og kikker på mysql´s manual lige nu :-)
Avatar billede tzag_dk Nybegynder
24. maj 2004 - 12:15 #14
Hej avlund

Har du fundet ud af noget mere? For det har jeg ikke :-(
Avatar billede tzag_dk Nybegynder
26. maj 2004 - 20:47 #15
Hej igen avlund...

Har du ikke flere forslag eller?
Avatar billede tzag_dk Nybegynder
01. juni 2004 - 10:10 #16
Er du der avlund??
Avatar billede fennec Nybegynder
02. juni 2004 - 12:52 #17
"select hotbilleder.id, hotbilleder.billede, count(hotstemmer.id) as antal from hotbilleder join hotstemmer on hotstemmer.hotbillederID=hotbilleder.id where count(hotstemmer.id)>=20 group by hotbilleder.id, hotbilleder.billede"

giver denne alle de billeder, der har over 20 stemmer???
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 12:59 #18
Det giver denne fejl :-(

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[TCX][MyODBC]Forkert brug af grupperings-funktion

Jeg har ingen anelse om hvordan jeg skal lave det...
Avatar billede fennec Nybegynder
02. juni 2004 - 13:03 #19
Har du brugt den, som jeg havde den, eller har du tilføjet flere felter til selecten??
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 13:05 #20
jeg har brugt den som du lavede
Avatar billede fennec Nybegynder
02. juni 2004 - 13:13 #21
"select hotbilleder.id, hotbilleder.billede, avg(hotstemmer.point) as score from hotbilleder join hotstemmer on hotstemmer.hotbillederID=hotbilleder.id group by hotbilleder.id, hotbilleder.billede"

kan du så få alle billeder med deres score på denne måde??
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 13:16 #22
Nej, men jeg tror at den er ved at være der.

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.
Avatar billede fennec Nybegynder
02. juni 2004 - 13:30 #23
hvilke felter er det, den ikke kender????
Det kan jeg ikke se.
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 14:15 #24
ok, det var min fejl, det var et helt andet sted som den ikke kunne finde det :-)

Den lister dem nu, men som du kan se her er det ikke den rigtige rækkefølge
http://www.spotpeople.dk/toplister/
Avatar billede fennec Nybegynder
02. juni 2004 - 14:16 #25
"select hotbilleder.id, hotbilleder.billede, avg(hotstemmer.point) as score from hotbilleder join hotstemmer on hotstemmer.hotbillederID=hotbilleder.id group by hotbilleder.id, hotbilleder.billede order by avg(hotstemmer.point)"

bliver de så sorteret????
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 14:20 #26
Nej, så brokker den sig lidt :-(

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[TCX][MyODBC]Forkert brug af grupperings-funktion
Avatar billede fennec Nybegynder
02. juni 2004 - 14:27 #27
det var da lige godt s....

vil den så bruge alias metoden???

select hotbilleder.id, hotbilleder.billede, avg(hotstemmer.point) as score from hotbilleder join hotstemmer on hotstemmer.hotbillederID=hotbilleder.id group by hotbilleder.id, hotbilleder.billede order by score"
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 14:31 #28
Yep det ville den :-) Jubiiiii!
Tak for det.

Ved du så også hvordan man laver én enkelt placering for brugeren? Lige som her på exp?
Avatar billede fennec Nybegynder
02. juni 2004 - 14:37 #29
??? hvad mener du...

vi mangler vel stadig kun at vise dem der har fået 20 stemmer eller mere.

"select hotbilleder.id, hotbilleder.billede, avg(hotstemmer.point) as score, count(hotstemmer.id) as antal from hotbilleder join hotstemmer on hotstemmer.hotbillederID=hotbilleder.id group by hotbilleder.id, hotbilleder.billede HAVING antal >= 20 order by score"
Avatar billede fennec Nybegynder
02. juni 2004 - 14:38 #30
Har lige fattet hvad du mente. Det kikker jeg lige på.....
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 14:40 #31
Det er også rigtig :-) Og det virker også fint :-)

Ok, jeg venter spændt...
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 14:49 #32
Jeg bliver desværre nødtil at smutte lidt :-(

Men jeg vender tilbage i aften igen :-)
Avatar billede fennec Nybegynder
02. juni 2004 - 15:03 #33
Den eneste måde jeg lige kan komme på, er ved at lave en funktion.

function getPlacering(FunkPicID)
  dim FunkRS, FunkCounter
  FunkCounter = 1
  set FunkRS = conn.execute("select hotbilleder.id, avg(hotstemmer.point) as score from hotbilleder join hotstemmer on hotstemmer.hotbillederID=hotbilleder.id group by hotbilleder.id order by score desc")
  do while not FunkORS.eof
    if cstr(FunkPicID) = cstr(FunkRS("id")) then
      exit do
    end if
    FunkORS.MoveNext
    FunkCounter = FunkCounter + 1
  loop
  getPlacering = FunkCounter
end function

Giver en placering pr billed. Hvis du skal bruge en placering pr bruger (hvilket du sikkert skal) bliver det lidt indviklet. For så skal vi vel have gennemsnittet af alle brugerens billeder, samt til at håndtere dem, som ikke har et billed.
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 17:36 #34
Jo det er en placering for et billede :-)
Det kan godt være at jeg ikke fik sagt det ordentlig.

Men jeg prøver lige det her :-)
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 18:07 #35
Jeg tænkte på om der ikke også skulle det her på sql´en, så at den ved hvad for et billede den har gang i?

where id = " & RShotbilleder("id")&"
Avatar billede tzag_dk Nybegynder
02. juni 2004 - 18:17 #36
Jeg fik rettet det til :-) Sådan her:

function getPlacering(FunkPicID)
  dim FunkRS, FunkCounter
  FunkCounter = 1
  set FunkRS = conn.execute("select hotbilleder.id, avg(hotstemmer.point) as score from hotbilleder join hotstemmer on hotstemmer.hotbillederID=hotbilleder.id group by hotbilleder.id order by score desc")
  do while not FunkRS.eof
    if cstr(RShotbilleder("id")) = cstr(FunkRS("id")) then
      exit do
    end if
    FunkRS.MoveNext
    FunkCounter = FunkCounter + 1
  loop
  getPlacering = FunkCounter
end function

Det var den her linke der lige skulle rettes lidt i:
if cstr(RShotbilleder("id")) = cstr(FunkRS("id")) then

Men det virker som det skal nu :-)
Mange tak for hjælpen igen igen! Ligger du et svar?
Avatar billede fennec Nybegynder
03. juni 2004 - 09:14 #37
Nu havde jeg lavet det, så du overførte billedID'et med funktionskaldet. Det gør den lidt mere universiel, så den kan bruges i andre sammenhæng også :o)

Hvis du havde gjort sådan:
response.write getPlacering(RShotbilleder("id"))

Men det er jo lige meget, så længe det virker.
Avatar billede tzag_dk Nybegynder
03. juni 2004 - 13:33 #38
Okay, så vfed jeg også det :-)
Mange tak for hjælpen!
Avatar billede fennec Nybegynder
03. juni 2004 - 13:40 #39
No prob.
Jeg elsker simpelthen dine opgaver. De får virkelig "klumpen på halsen" til at arbejde :o)
Avatar billede tzag_dk Nybegynder
03. juni 2004 - 14:34 #40
hehe... Det skal jeg huske :o)
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