Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 675
Sitter å vrir de små grå, kanskje databasen må tweakes litt, men dette burde funke, spørringen er bare .. vanskelig?

DB: mySQL
Kan evnt backes opp av php

To tabeller:

Bilde
pid | name | path
777 | lucky | folder/luckynr7.jpg
666 | devil | folder/notsoluckynr7.jpg

Bilde_har_stemmer
pid | voteValue | date
777 | 5 | unixDate
777 | 3 | unixDate
777 | 1 | unixDate
666 | 1 | unixDate
666 | 5 | unixDate
666 | 4 | unixDate


Av dette skal jeg kunne spore om hvilke bilder som er mest populære (høyest score).

Innser at jeg må gjøre litt mate i spørringen, både count og sum, for så å få en score som igjen kan brukes til å hente ut rekken med de x mest populære bilder. Idéelt skulle jeg også finne mest populære pr tidsenhet, f.eks pr uke/måned.

Noen som har noen tips?

Kode

SELECT AVG(voteValue) from Bilde_har_stemmer group by pid
Å joine denne spørringa opp mot den andre tabellen, regner jeg med du greier selv.

Om du skal finne mest populære pr tidsenhet, må du først lage en fellesnevner for tidsenheten (ved å bruke from_unixtime() og date()), deretter grupere per tidsenhet og til slutt gruppere etter pid.
Trådstarter
51 5

Kode

SELECT photo.pname, photo.pfilename, photo_has_rating.imgId FROM photo, photo_has_rating WHERE photo.pid = photo_has_rating.imgId group by photo_has_rating.imgId order by AVG(voteValue) desc limit 10;
tabellene mine heter da photo_has_rating og photo. I photo_has_rating heter pid imgId (sånn for å gjøre forvirringen komplet)

Men nå får jeg altså ut de mest populære (over all), men trenger fortsatt å begrense dette pr tid (mest pop forrige uke, måned osv)

Om skarpe hjerner ser løsningen: jeg er fortsatt keen hint og vink.

Tid:
tiden ligger som unixdate, satt inn ved php's date(u)
resultatene er da (om jeg har forstått dette rett) antalle sekunder etter kl X 1970, ser i alle fall slik ut: 1177325836, 1177325740, osv
(10 siffer pr tuppel)
Sist endret av Nanaki; 23. april 2007 kl. 13:35.
nso
popålol
nso's Avatar
Administrator
Som ripz skrev; from_unixtime.
F.eks:

Month(from_unixtime(1177325836)) returnerer måneden for timestampen og Week() returnerer uke, osv.. Det du da har som jobb er å bruke date() til å regne deg frem til hva som er forrige uke, eller måned, så kan du kjøre en WHERE hvor du sammenligner den med resultatet av Week() eller Month() som vist i begynnelsen.

Det er forresten greit om du legger koden ut i litt ryddigere format, for lesbarhet.
Du kan også med fordel bruke JOIN, slik:

Kode

SELECT photo.pname, photo.pfilename, rating.imgid
FROM photo
	JOIN photo_has_rating AS rating ON ( photo.pid = rating.imgid )
GROUP BY rating.imgid
ORDER BY AVG(rating.votevalue) DESC 
LIMIT 10;