Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Statystyka - które miejsce zajmuje użytkownik
Forum PHP.pl > Forum > Bazy danych > MySQL
japolak
witam
no i zrobiłem sobie tabele ze statystyką
tak jak poniżej prezentuje foto:



mam taki problem

jak z tej tabeli wyciągnąć:

informację na którym miejscu jest uzytkownik wg całego rankingu , i wg danego miesiaca

wiem jak wyświetlić ogolną statystykę
  1. SELECT SUM( points ) , id_user
  2. FROM `statistics`
  3. GROUP BY id_user
  4. ORDER BY SUM( points ) DESC


ale nie wiem jak wyciągnąć dane miejsce na którym jest użytkownik,
wg. tabeli powyżej powinno wyjść przykładowo dla user 4 - 3 miejsce

kto pomoże??

może zapytam inaczej - chodzi tu o numer wiersza w którym na którym bedzię urzytkownik 4
jak można sprawdzić kótry numer wiersza z wyniku zapytania spełnia warunek gdzie user = 4
ixox
  1. SET @rank=0;
  2.  
  3. SELECT @rank:=@rank+1 AS rank, SUM( points ), id_user
  4. FROM `statistics`
  5. GROUP BY id_user
  6. ORDER BY SUM( points ) DESC

Spróbuj tak. Tak na szybko. smile.gif
sazian
jest fajniejszy sposób na numrowsa
  1. SELECT *,@numrows:=@numrows+1 FROM tabela,(SELECT @numrows:=1) num
  2.  
japolak
Cytat(ixox @ 26.09.2012, 12:32:21 ) *
  1. SET @rank=0;
  2.  
  3. SELECT @rank:=@rank+1 AS rank, SUM( points ), id_user
  4. FROM `statistics`
  5. GROUP BY id_user
  6. ORDER BY SUM( points ) DESC

Spróbuj tak. Tak na szybko. smile.gif



dzięki smile.gif pomogło

działająca wersja dla wyszukania miejsca konkretnego użytkownika:
  1. SET @rank=0;
  2.  
  3. SELECT *
  4. FROM (
  5.  
  6. SELECT @rank := @rank +1 AS rank, SUM( points ) , id_user
  7. FROM `statistics`
  8. GROUP BY id_user
  9. ORDER BY SUM( points ) DESC
  10. ) AS pozycja
  11. WHERE pozycja.id_user =4


oraz działająca wersja dla wyszukania miejsca konkretnego użytkownika wg. punktacji z danego miesiąca:
  1. SET @rank=0;
  2.  
  3. SELECT *
  4. FROM (
  5.  
  6. SELECT @rank := @rank +1 AS rank, SUM( points ) , id_user
  7. FROM (SELECT * FROM `statistics` WHERE DATE_FORMAT(DATE,'%m %Y')= DATE_FORMAT(now(),'%m %Y')) AS tymczas
  8. GROUP BY id_user
  9. ORDER BY SUM( points ) DESC
  10. ) AS pozycja
  11. WHERE pozycja.id_user =4



zmasz może szybszą wersje:) questionmark.gif

Cytat(sazian @ 26.09.2012, 21:57:14 ) *
jest fajniejszy sposób na numrowsa
  1. SELECT *,@numrows:=@numrows+1 FROM tabela,(SELECT @numrows:=1) num
  2.  



to też działa jak należy chodź wychodzi na to ze troche wolniejsze jest

rozwiązanie mojego zadanie wg. twojej podpowiedzi:

miejsce w całym rankingu
  1.  
  2. SELECT *
  3. FROM (
  4.  
  5. SELECT *,sum(points),@numrows:=@numrows+1 AS miejsce FROM statistics,(SELECT @numrows:=0) num
  6. GROUP BY id_user
  7. ORDER BY SUM( points ) DESC
  8. ) AS pozycja
  9. WHERE pozycja.id_user =3


miejsce w rankingu z ostatniego miesiaca
  1. SELECT *
  2. FROM (
  3.  
  4. SELECT *,sum(points),@numrows:=@numrows+1 AS miejsce FROM (SELECT * FROM `statistics` WHERE DATE_FORMAT(DATE,'%m %Y')= DATE_FORMAT(now(),'%m %Y')) AS tymczas,(SELECT @numrows:=0) num
  5. GROUP BY id_user
  6. ORDER BY SUM( points ) DESC
  7. ) AS pozycja
  8. WHERE pozycja.id_user =3



dzieki!!
mmmmmmm
Wszystko fajnie, tylko że to nie są funkcje rankingujące... smile.gif Tylko nadające rownum, a to zupełnie co innego - nie uwzględnia pozycji ex-equo.
Np. dla podanych poniżej wartości zadziała źle:
sklep sprzedaż
1 100
2 200
3 100
4 200

Zwróci:
1 100 1
3 100 2
2 200 3
4 200 4

A powinien:
1 100 1
3 100 1
2 200 3
4 200 3
japolak
Cytat(mmmmmmm @ 27.09.2012, 08:26:25 ) *
Wszystko fajnie, tylko że to nie są funkcje rankingujące... smile.gif Tylko nadające rownum, a to zupełnie co innego - nie uwzględnia pozycji ex-equo.
Np. dla podanych poniżej wartości zadziała źle:
sklep sprzedaż
1 100
2 200
3 100
4 200

Zwróci:
1 100 1
3 100 2
2 200 3
4 200 4

A powinien:
1 100 1
3 100 1
2 200 3
4 200 3



Chol...e... ra racja..

Jak więc napisać takie cośquestionmark.gif
sazian
  1. SELECT tab.*,IF(@point<>point,@numrows:=@numrows+1,@numrows) num,IF(@point<>point,@point:=point,@point) p FROM
  2.  
  3. (
  4. SELECT 1 AS id,100 AS point
  5. UNION
  6. SELECT 2,100
  7. UNION
  8. SELECT 3,200
  9. UNION
  10. SELECT 4,200
  11. UNION
  12. SELECT 5,600
  13. ) tab,
  14. (SELECT @point:=-1,@numrows:=0) tab2
  15. ORDER BY point

jest jedna wada
podaje numeracje od końca
czyli aktualna pozycja to count(*)-num
oczywiście count musisz wyciągnąć w osobnym zapytaniu
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.