Chcę zaimplementować najlepsze wyniki w Internecie dla mojej gry. I powiedz graczom, które miejsce mają (nie tylko top100 lub coś podobnego). W normalnym SQL wyglądałby tak:Jak zaimplementować najlepsze wyniki w Internecie w Google App Engine
SELECT COUNT (*) FROM żywo GDZIE Punkty>: newUsersPoints
i GQL mają coś podobnego
db.GqlQuery ("SELECT * FROM wynik GDZIE punkty >: 1 ", newUsersPoints) .count()
, ale ponieważ count() jest ograniczone tylko do 1000, nie będzie bardzo przydatne w moim przypadku. Czy masz jakieś pomysły, jak to wdrożyć?
mam dwa
pierwsze:
Wykorzystanie Liczniki fragmentowanie pomysł (http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) Utwórz nowe "stół", który przechowuje ile wyniki są w pewnym zakresie (from_points, to_points)
Podsumuj wszystkie liczniki z powyższej tabeli, gdzie range.to_points < newUsersPoints
Znajdź, ile wyników jest większych niż wyniki w zakresie, w którym nowy wynik to db.GqlQuery ("WYBIERZ * Z WYGRANY WHERE points>: 1 AND points> =: 2 AND points <: 3", newUsersPoints, range.from_points , range.to_points) .count() + sumfrom2
zakres Wyszukiwanie w którym nowy wynik i zwiększyć jego przeciw
podziału zakresów którym licznik jest większa niż 1000 (lub 999), tak aby 3. wouldn 't osiągnie limit
Dodaj nowy wynik do tabeli wyników
Co jest dość skomplikowane i podatne na błędy. Przed dodaniem wyniku możemy zwiększyć zakres i Czas oczekiwania. (Nie transakcyjna)
Drugi pomysł:
Od czasu do czasu (? Raz dziennie) Sortuj wszystkie wyniki poprzez punkty i dać im nowe pozycje (skrypt może timeout więc musimy to zrobić w kawałki)
Aby dowiedzieć się, w którym miejscu nowy wynik jest po prostu zrobić
db.GqlQuery ("SELECT * FROM wynik GDZIE punktów>: 1 LIMIT 1", newUsersPoints). .get() precalculated_position + 1
Jakieś inne pomysły?