» »

mysql rank glede na oceno

mysql rank glede na oceno

HardFu ::

Za namen lazje predstavitve bom zadevo malce posplosil, v glavnem pa je pristop isti.

Torej imam dve mysql tabeli, 'Posts' in 'Comments'. Slednja ima polje 'Comments.post_id', da se ve kateremu postu pripada in 'Comments.score', ki je ubistvu integer od 1 - 5, torej ocena posta. Sedaj zelim sortirati poste glede na povprecno oceno IN glede na stevilo komentarjev. Zelim se izogniti temu, da bi bil post z enim komentarjem in oceno 5 na prvem mestu (ker je povprecna ocena 5) ampak bi bili v racunico vzeto tudi stevilo komentarjev. Se pravi da bi bila povprecju dodana se neka teza glede na stevilo komentarjev. Ima kdo kaksno idejo kaksna formula bi bila najboljsa za najboljse rezultate?

MySQL query ni nujen, je pa zazeljen da prisparam kaksno uro.

Hvala in LP
http://codeable.io

Ice-Heki ::

Večje ko je število komentarjev - bolj realna je ocena.
Torej sortiraj po povprečni oceni, nato pa še po številu komentarjev.

HardFu ::

Ce bi naredil tako, potem je se vedno boljse ce ima post en sam komentar z oceno 5 kot pa ce ima 30 komentarjev z oceno 4, kar pa ni v skladu s tvojim prvim stavkom.
http://codeable.io

user4683 ::

avg*log(n)?

zerox ::

Tako kot je rekel snake oz avg+avg*log(n) (ker je log(1)=0). Lahko pa tudi izbereš sam kakšno drugo logiko ampak je zadeva zelo odvisna od tega koliko komentarjev imaš v povprečju in kako ti variirajo ocene.

HardFu ::

snake, xerox, hvala tocno to sem rabil. Zaenkrat je sistem se v fazi razvoja, pricakuje pa se okoli 100 komentarjev in predvsem visje ocene (4 in 5)
http://codeable.io

Zgodovina sprememb…

  • spremenil: HardFu ()

MrBrdo ::

Jaz uporabljam formulo od IMDBja:
weighted rank (WR) = (v / (v+m)) * R + (m / (v+m)) * C

where:
R = average for the movie (mean) = (Rating)
v = number of votes for the movie = (votes)
m = minimum votes required to be listed in the Top 250 (currently 1250)
C = the mean vote across the whole report (currently 6.8)


Zame zelo dobro deluje.
Lp.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

HardFu ::

Zanimivo, prvic slisim za 'Bayesian estimate', vsekakor pa se bom bolj pozanimal o tem. Hvala
http://codeable.io

MrBrdo ::

Edini problem je da rabis vec queryjev (vsaj jaz nisem uspel drugace naredit). V Rails mam trenutno takole, za zgornjo formulo:
      all_scores = Pic.sum('score', :conditions => ["num_scores > 0"])
      num_of_all_scores = Pic.sum('num_scores', :conditions => ["num_scores > 0"])
      site_avg = all_scores.to_f / num_of_all_scores.to_f
      min_votes = 1.0
      topPics = Pic.find(:all, :conditions => ["num_scores > 0"],
        :order => "((num_scores / (num_scores + #{min_votes})) * (score / (num_scores * 1.0)) + (#{min_votes} / (num_scores + #{min_votes})) * #{site_avg}) DESC",
        :limit => 10)

V vsakem primeru mirkaj v SQL, da bos imel v floating point, ker jaz sem najprej dobival napacne rezultate (ce opazis zdaj tam tisti "* 1.0" - to je zato).
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Filmski kritiki in ocenjevanje filmov (strani: 1 2 )

Oddelek: Sedem umetnosti
6911206 (10005) FormerUser
»

Kateri ne-bloatware antivirus za Windows 7?

Oddelek: Programska oprema
385831 (4759) sisemen
»

Heaven - DirectX11 benchmark

Oddelek: Navijanje
132131 (1490) ekseR
»

(Access) query po datumu

Oddelek: Programiranje
211949 (1524) imagodei
»

Vote script(php)-problem?

Oddelek: Izdelava spletišč
5949 (905) AlexUS

Več podobnih tem