Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ranking w SQL
barcin
post 17.10.2006, 09:35:08
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 2.01.2006

Ostrzeżenie: (0%)
-----


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

Ten post edytował barcin 17.10.2006, 09:35:58
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post 17.10.2006, 09:45:31
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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;


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
barcin
post 17.10.2006, 10:18:39
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 2.01.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post 17.10.2006, 10:21:10
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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)


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
barcin
post 17.10.2006, 10:31:04
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 2.01.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post 17.10.2006, 10:52:37
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
barcin
post 17.10.2006, 12:47:49
Post #7





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 2.01.2006

Ostrzeżenie: (0%)
-----


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

Ten post edytował barcin 17.10.2006, 12:46:49
Go to the top of the page
+Quote Post
nospor
post 17.10.2006, 13:04:59
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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)


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
barcin
post 17.10.2006, 13:14:00
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 2.01.2006

Ostrzeżenie: (0%)
-----


Używam wersji 4.1.11.

Zaraz przetestuję, wielkie dzięki jeszcze raz.

Pozdrawiam,

barcin
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 21:19