Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ranking w SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
barcin
Witam,

Mam pytanko dotyczace zapytania SQL.

Otoz mam w bazie tabele:

  1. CREATE TABLE `artwork` (
  2. `UserId` int(10) UNSIGNED NOT NULL DEFAULT '0',
  3. `Points` int(10) UNSIGNED NOT NULL DEFAULT '0',
  4. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Chce stworzyc zapytanie sql, ktore zwrocilo by mi ranking osob z bazy na podstawie ilosci ich punktow.
Nie chodzi mi jednak o zwykle 'order by points', poniewaz: musze posortowac uzytkownikow po ich ID i potrzebuje miec w zwroconym rekordzie takze miejsce w rankingu danego usera, co oznacza, ze jesli kilku userów ma tą sama ilosc punktow, powinni miec taka sama pozycje w rankingu.

Czy jest ktos w stanie mi pomoc, ewentualnie pokazac kierunek dzialania? Bo mi do glowy przychodza same jakies skomplikowane zapytania, tworzenie tymczasowych tabel itd, a chce zeby to w miare sprawnie chodzilo przy duzej liczbie wywoaln zapytania i duzej liczbie rekordow.

P.S. Uzywam MySQL 4.x

Z gory dziekuje za pomoc,

Barcin
nospor
skoro uzywasz Mysql to na MySql powinienies to byl dac, przenosze.

Tak na szybko:
  1. SET @pos=0;
  2. SET @points = -1;
  3. SELECT UserId,Points, IF (@points <> Points,@pos:=@pos+1,@pos) pos, IF (@points <> Points,@points:=Points,Points) FROM users ORDER BY Points DESC;
barcin
dzieki, niestety jest jakiś bład:

#1054 - Nieznana kolumna 'Points' w field list

Bylbym wdzieczny za pomoc.

P.S.

Przepraszam, za pozno sie zreflektowalem, ze istnieje kategoria MySQL. Dzieki za przeniesienie.

barcin
nospor
no popatrz, a mi dziala winksmiley.jpg

Na pewno masz kolumne Points? Bo z komunikatu wynika, ze chyba jednak nie masz. (wielkosc liter tez moze miec znaczenie)
barcin
no, teraz mi tez dzilaa, echhh, bezmyslnie skopiowalem kod, a tam uzyles innej nazwy tabeli niz ja.

Wielkie dzieki, zaoszczedziles mi sporo pracy, Mistrzu

pozdrawiam,

barcin
nospor
w zasadzie to troche przekombinowalem z drugim warunkiem w select. Mozna zrobic zwykle przypisanie. Czyli zamiast:
  1. ...IF (@points <> Points,@points:=Points,Points)....

dac:
  1. ...@points:=points....

Ciut krocej winksmiley.jpg

Cytat
zaoszczedziles mi sporo pracy, Mistrzu

Nie ma sprawy, Małgorzato winksmiley.jpg

edit:
Bo i Malgorzata nie miala byc obraźliwym okresleniem. Nie wiem czy czytales ksiązke "Mistrz i Malgorzata", a ze nazwales mnie Mistrzem to od razu taki zart mi sie skojarzyl smile.gif
barcin
Dzięki, skopiowałem i działa.

Że mi pomogles w kodzie, to sie za Małgorzate nie obraze snitch.gif



Hej, mam jeszcze jedno pytanie. W jaki sposob zmodyfikowac ten kod, a by moc uzyskac pozycje dla konkretnego Usera, poniewaz zwykle dodanie WHERE userid=x nie dziala winksmiley.jpg

Pozdrawiam,

barcin
nospor
Napisales:
Cytat
Uzywam MySQL 4.x
I teraz wazne ile to "x" wynosi. Bo jesli mniej niz 1, to niedobrze.

  1. SET @pos=0;
  2. SET @points = -1;
  3. SELECT login, pos, points FROM ( SELECT id_uzyt, login,points, IF (@points <> points,@pos:=@pos+1,@pos) pos, @points:=points FROM users ORDER BY points DESC) SUB WHERE id_uzyt = 3;

tylko dopasuj do siebie (popraw kolumny i tabele)
barcin
Używam wersji 4.1.11.

Zaraz przetestuję, wielkie dzięki jeszcze raz.

Pozdrawiam,

barcin
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.