20. maj 2004 - 18:12Der 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---
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 )
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 )
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
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 )
"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???
"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??
"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)"
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"
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"
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.
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?
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"))
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.