Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] lista rankingowa
Forum PHP.pl > Forum > Bazy danych > MySQL
vokiel
Mam problem merytoryczny jak rozwiązać listę rankingową.
Lista działa na zasadzie, że każdy kontrahent zbiera punkty w dwóch kategoriach. Chcemy wybrać tych najlepszych, czyli np 5 z jednej i z drugiej kategorii i ich nagrodzić. Dodatkowo dla osób które będą najlepsze na dwóch listach mamy dodatkową nagrodę. Załóżmy że nagrodą jest wycieczka, to dla tych 'zwykłych' mamy po jednym miejscu, a dla tych 'lepszych' mamy miejsca podwójne.

Zatem lista wyglądałaby tak:
| Miejsca podwójne |
1. xxx
2. yyy
3. zzz

|Miejsca pojedyncze |
| kat 1 | | kat 2 |
1. zjz 1. alb
2. sjs 2. emo
3. sks 3. kij
4. kgl 4. omg
5. wtf 5. imho
(wysyłamy na wycieczkę 13 osób, z czego 3 mogą zabrać kogoś ze sobą)

Czyli osoba ma szanse na miejsce podwójne jeśli jest na obu listach kategoriowych (ale słowo;> ). Jeżeli już ktoś trafi na liste miejsc podwójnych, to usuwamy go z listy kategorii 1 i 2, a na jego miejsce wchodzą następni.

Myślałem, żeby zrobić to na jednej tabeli (w uproszczeniu):
|ID_KONTRAHENTA| PUNKTY_KAT_1 | PUNKTY_KAT_2 |

w jednym zapytaniu to chyba nie da rady (przynajmniej ja jestem za słaby w tym temacie winksmiley.jpg ). Myślałem żeby to zrobić na pare kroków.
Czyli wybrać tych kontrahentów z kategorii 1 ktorzy maja tez punkty w kategorii 2 (jest bardzo prawdopodobne, że będą mieli w obu).
z tych kontrahentów wybieramy 3-ech najlepszych (czli takich, dla których średnia z jednej i drugiej kategorii jest najwyzsza).
No i tu pojawia się problem, bo może sie trafić tak, że zabierzemy 3-ech najlepszych z pierwszej kategorii i na ich miejsce musimy wciągnąć trzech nowych, ale może być też tak, że z tej listy zabierzemy tylko jednego. Czyli trzebaby sprawdzić ile osób z której listy zabraliśmy do tej grupy z miejscami podwójnymi, żeby później zbudować zapytanie na kategorie 1 i 2 z odpowiednim limitem.

Czy ma może ktoś lepsze pomysły (nie chodzi mi o kod, gotowca) merytoryczne, sposobu rozwiązania problemu, dobrze przemyślane?
Byłbym bardzo wdzięczny za pomoc smile.gif
nospor
Ale kombinujesz. Robienie wszystkiego w mysql nie zawsze jest dobrym rozwiązaniem.
Pobierz po 10 osob z kazdej kategorii i zapisz sobie do tablicy w php.
Nastepnie przelec po tej tablicy i wwal kazdego kto jest w obu tablicach do trzeciej tablicy. Pamietaj o tym by jednoczesnie usunac tego gostka z dwoch pierwszych tablic. Gdy juz wylapiesz "rodzynki" wyswietl po 5 osob z kazdej z pierwszych dwoch tablic a reszte ktora ewentualnie zostala - olej
vokiel
Dzięki za pomysł.
Czyli zapisując do tablicy (tych wybranych) musiałbym jeszcze zaznaczyć z której listy pochodzą. Zliczyć ile mamy wystąpień pierwszej listy, a ile drugiej, a następnie stworzyć stworzyć 2 proste selekty na te dwie podlisty.
Narazie to nejlepszy (jedyny sensowny) sposób rozwiązania.
nospor
Cytat
Czyli zapisując do tablicy (tych wybranych) musiałbym jeszcze zaznaczyć z której listy pochodzą
Mowisz o tych co sa na dwoch listach? No to oni pochodzą z obu i nie musisz zaznaczac z ktorej są bo są z obu smile.gif

Cytat
Zliczyć ile mamy wystąpień pierwszej listy, a ile drugiej, a następnie stworzyć stworzyć 2 proste selekty na te dwie podlisty.
A tu juz zupelnie nie wiem o czym mowisz. Mowisz o pobraniu tych 10 z kazdej listy? Tu wystarczy jeden select ze skladnią UNION.
vokiel
Wstyd ujma i hańba ;>
Dzięki wielkie!

Chciałem zapisywać kogo już mam w tej liscie 3 wybranych, bo jeśli wystąpi taki przypadek:
lista 1 lista 2
1. zzz 1. mmm
2. xxx 2. aaa
3. yyy 3. yyy
4. mmm 4. bbb
5. aaa 5. ccc
6. bbb 6. zzz

I po wybraniu tych trzech najlepszych z tych dwóch list, wyjdzie, że kwalifikują się tylko mmm, aaa, yyy. To nie mogę po prostu sobie wybrać 5 najlepszych, ani np 5 najlepszych od 2giej pozycji. Bo jak w przykładzie mogą to być osoby z różnych pozycji listy. Na jednej może być najniżej, a na drugiej bardzo wysoko, co w rezultacie da mu miejsce u wybrańców.
Ale wystarczy, że zapisze ich id, i potem odrzucę je, generując listy 1 i 2.
nospor
Cytat
Ale wystarczy, że zapisze ich id, i potem odrzucę je, generując listy 1 i 2.
Obie listy powinny wyglądac tak, ze indexem jest id osoby, a wartoscią nazwa. Odrzucenie rodzynka z dwoch list polegac bedzie na zwyklym unset() na tablicy dla danego indexu. Dzieki id w indexach latwo tez znajdziesz osoby ktory są w obu listach - wystarczy wowczas isset()
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.