Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]mysql sortowanie wg liczby pogrupowanych rekordów
Forum PHP.pl > Forum > Przedszkole
neo1986kk
Witam, chciałbym uzyskać kolejność wg liczby wyników zapytania dokladnie chodzi mi o liczbę głosów, czyli:

id na_kogo
1 kinia
2 kinia
3 kinia
4 lisa
5 kinia
6 lisa
7 edek
8 kinia
9 edek
10 lisa

chcialbym uzyskac cos takiego:

pierwsza kinia - 5 glosów
druga lisa - 3 głosy
trzeci edek 2 głosy


myśle nad tym w ten sposób żeby wybrac rekordy z bazy i je pogrupować, ale wczesniej muszę chyba użyć 'Count' tylko nie wiem czy to dobre myślenie i szczerze mowiąc jak się tak na prawdę za to zabrać, pomożecie?
wookieb
  1. SELECT *, count(id) AS ile FROM tabela GROUP BY na_kogo ORDER BY ile DESC
neo1986kk
a jak z tego wyciągnąć ilość głosów?

albo jeszcze inaczej, dla konkretnego usera
czyli np

dla kinia będzie

  1. SELECT *, count(id) AS ile FROM tabela WHERE na_kogo='kinia' GROUP BY na_kogo ORDER BY ile DESC


i tera potrzebuje z tego wyciągnąć

Zajmujesz x miejce
Masz y glosow
wookieb
Wykonaj to zapytanie o będziesz widział.
neo1986kk
ale z tego zapytania chyba nie wyciągnę miejsca na ktorym sie znajduje dana osoba, musze zrobić drugie zapytanie gdzie pogrupuje wszystkie osoby i posortuje po ilosci glosow i do tego sprawdze ktory wiersz to ta osoba, hmm w ogole da sie sprawdzic na ktroej pozycji znajduje sie taka osoba? jesli dobrze myślę to znów bede musial dać coś AS id i z tego zebrać?

Edit nie no cos pokopałem...

pobieram liste wszystkich
i count(id) as ile
teraz grupuje po ile
i mam pokolei miejsca

aha no i sie zatrzymalem przy tym zeby sprawdzić ktore miejsce nalezy do ktorej osoby
wookieb
Najlepiej raz na jakiś czas (albo w momencie zagłosowania) przeliczyć liczbę głosów i zapisać ją w oddzielnej tabeli. Najbardziej efektywne rozwiązanie.
neo1986kk
no tak ale z tabeli

id na_kogo ilosc_glosow
1 kinia 20
2 edek 15
3 lisia 10

wyciągne żę np dla edek jest to 2 miejsce?
wookieb
Na forum i w internecie było wielokrotnie mówione o skryptach rankingów, więc nie będę powtarzać wszystkiego.
Jedyne co musisz stworzyć to tabelę o takiej strukturze
  1. miejsce | osoba | liczba_glosow

Klucz główny składa się z kolumn(miejsce, osoba)
Przy każdym dodaniu głosu należy zadbać o aktualność tabeli.
Jeżeli jest to jeden głos to oczywiste że możesz zrobić to sprytnie (sprawdzić czy to zmienia sytuacje na liście wyników, jak tak to odświeżasz tylko skorelowane rekordy)
Jeżeli przeliczasz raz na jakiś czas to załadowanie danych do tabeli będzie ostatecznością
  1. TRUNCATE TABLE ranking_wynikow;
  2. INSERT INTO ranking_wynikow (osoba, liczba_glosow) SELECT na_kogo, count(id) AS ile FROM tabela GROUP BY na_kogo ORDER BY ile DESC
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.