Myślę, że najlepsze rozwiązanie to wyznaczenie średniej oceny a następnie branie pod uwagę ilości oddanych głosów. W zależności od średniej, duża ilość głosów świadczyłaby na korzyść lub niekorzyść wartości oceny o tej samej średniej.
Teraz chodzi o ustalenie wagi głosów. Bo akurat skrajne głosy są oczywiste, 3x10 jest mniej warte od 5x10, ale 5x1 jest mniej warte od 3x1. Ale co w przypadku 3x3 a 5x3? Co w przypadku 3x4 a 5x4? Trzeba przyjąć połowę, czyli średnią 5,5. Oceny o tej samej średniej, ale większej (lub równej) od połowy, będą sortowane wg. malejącej ilości głosów, te ze średnią mniejszą od połowy, sortowane wg. rosnącej ilości głosów.
Jak to będzie wyglądało w praktyce?
Fotka 1: 1 1 1 1 1 1 1 1 (średnia: 1, głosów: 8)
Fotka 2: 1 1 1 1 1 (średnia: 1, głosów: 5)
Fotka 3: 1 1 1 1 1 1 1 1 1 1 1 1 2 (średnia: 1.076, głosów: 13)
Fotka 4: 1 1 1 1 1 1 1 1 1 1 1 1 1 3 (średnia: 1.143, głosów: 14)
Fotka 5: 5 6 (średnia: 5.5, głosów: 2)
Fotka 6: 5 6 5 6 5 6 5 6 (średnia: 5.5, głosów: 8)
Fotka 7: 5 5 6 5 6 5 6 5 (średnia: 5.375, głosów: 8)
Fotka 8: 5 (średnia: 5, głosów: 1)
Fotka 9: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 (średnia: 5, głosów: 25)
Posortowane da w wyniku fotki (kolejno od najlepszej do najgorszej):
6, 5, 7, 8, 9, 4, 3, 2, 1
Trzeba więc przyjąć, że Fotki o średniej < 5.5 są negatywne, a fotki >= 5.5 pozytywne. Im mniej głosów w fotce o ocenie negatywnej tym lepiej, odwrotnie dla fotek pozytywnych: ogromna ilość głosów przy zachowaniu oceny pozytywnej jest więcej warta od tej samej średniej ale uzyskanej np. 3 głosami.
Ciężko będzie znaleźć inne rozwiązanie. Te podane przez Spirit86 raczej odpadają. Pierwszy sposób nie zmienia właściwie nic, drugi zaś o ilę się nie mylę wykaże, że 2x10 + 1000x1 jest lepsze od 1x10 + 1x1.
Namieszałem, co?
W bazie dla każdej fotki przechowywana jest suma głosów i ilość głosów. Teraz wyciągasz za pomocą dwóch zapytań fotki pozytywne i negatywne (przyznaję się bez bicia, że nie wiem jak rozwiązać to za pomocą jednego zapytania) sortując je głównie wg średniej oceny (suma/ilość) a następnie wg. ilości głosów (inaczej dla obu zapytań, w zalezności od tego czy fotki są pozytywne czy negatywne).
Coś jakby:
Kod
[Pozytywne]: SELECT photo_id FROM photo_rating WHERE photo_rate_sum/photo_rate_count >= 5.5 ORDER BY photo_rate_sum DESC, photo_rate_count DESC
Kod
[Negatywne]: SELECT photo_id FROM photo_rating WHERE photo_rate_sum/photo_rate_count < 5.5 ORDER BY photo_rate_sum DESC, photo_rate_count ASC
I to właściwie tyle...
Pozdrawiam!