Zapytanie MySQL budujące ranking

0

Witam serdecznie,
Mam następującą tabelę:

CREATE TABLE IF NOT EXISTS `baza_pkt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idusera` int(11) DEFAULT NULL,
  `pkt` int(11) DEFAULT '0',
  `datadodania` date NOT NULL,
  `rodzajpkt` int(11) NOT NULL DEFAULT '0',
  UNIQUE KEY `id_2` (`id`),
  KEY `gt_id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
 

W tabeli znajdują się rekordy z punktami użytkowników.
Wpisów dla każdego usera są różne ilości (może być jeden, dwa... 10... 1000 itp).

Chciałbym zbudować ranking użytkowników (czyli zsumowane punkty dla każdego usera + posortowanie od największej do najmniejszej ilości pkt).

Ma ktoś może pomysł jak to zrobić?

Bardzo proszę o pomoc.

Próbowałem coś takiego:

SELECT id, idusera, pkt, rodzajpkt, FIND_IN_SET( pkt, (
SELECT GROUP_CONCAT( pkt
ORDER BY pkt DESC )
FROM cms_users_pkt )
) AS rank
FROM cms_users_pkt
ORDER BY rank ASC

Ale sortuje mi to po ilości punktów - bez uwzględnienia tego że parę userów może mieć po parę rekordów (nie sumuje ich)

Czy mógłbym prosić o pomoc?

Z góry dziękuje,
Northwest

0

spróbuj tak:

 select id_usera,sum(pkt) as ranking from  baza_pkt  group by id_usera order by ranking 
0

Działa, dziękuję :)
Da się obliczyć jakoś średnie miejsce danego użytkownika na przestrzeni wszystkich miesięcy dostępnych w bazie (jest pole z datą w tabeli)? :)

0

myślę że to musisz zrobić po stronie aplikacji
baza zwróci listę rankingową ale nie poda miejsca USERA na liście

być może dało by się to zrobić po stronie bazy , ale trzeba by stworzyć odpowiednią porcedurę składowaną , która zwróciła by tabelę zawierającą id_usera i jego miejsce w tabeli

0

Musiałbyś dla każdego usera i każdego miesiąca wyznaczyć miejsce, a następnie wziąć średnią AVG. Zapytanie możliwe do napisania, ale nietrywialne. Poza tym powstaje pytanie czy jest sens liczyć x razy wartość, która się nie zmienia? Jeżeli miesiąc się skończył to user nie zdobędzie już dodatkowych punktów. Lepiej na początku miesiąca liczyć ranking userów z miesiąca poprzedniego i zapisywać do osobnej tabeli. W takim wypadku wyciągnięcie średniego miejsca robi się już dużo prostsze, a my oszczędzamy serwer bazodanowy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1