Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie sumujące z ograniczeniami
Forum PHP.pl > Forum > Bazy danych > MySQL
Aztech
Chciałbym z następującej tabelki:
| TournID | PersonID | Score | Games |
Wybrać z ostatnich turniejów tyle wpisów, aby liczba gier była < 100.
Stworzyłem już zapytania z SUM na wszytkie możliwe sposoby, ale nie mam zielonego pojęcia jak skonstruować pozostałe warunki sad.gif
Próbowałem również kombinować w następujący sposób
  1. SELECT * , @t := @t + Gry
  2. FROM `listarank` AS l
  3. WHERE @t <100
  4. ORDER BY turnid DESC

Ale również bez sukcesu
prgTW
- Jakiego typu jest kolumna "Games" (SET [OF] ?)
- Czy jeden wpis (turniej) dotyczy jednej gry - pole "Games" np varchar, int, enum z jedna wartoscia, czy w polu Games masz gry wymienione np. po przecinku i chcesz policzyc turnieje ktore dotycza nie wiecej niz 100 gier?

edit: Dorzuc kilka przykladowych wierszy z Twojej tabeli

Moze o to Ci chodzi?
  1. SELECT * FROM `listarank` AS l ORDER BY `turnid` DESC LIMIT 99
Aztech
@prgTW: zdecydowanie nie o to mi chodzi
Przykładowe dane:
1 10 1500 6
1 12 1460 6
1 13 1200 5
1 26 1000 3
2 10 1436 6
2 13 1564 6
...
55 10 1342 5
55 13 1542 5
55 14 1321 4
mwojcik
Podaj tez jakie chcesz wynikowe rekordy otrzymac, bo nie wiem za bardzo o co ci chodzi w pierwszym poscie.
prgTW
Cytat
Wybrać z ostatnich turniejów tyle wpisów, aby liczba gier była < 100.

Gra dla turnieju jest zawsze rowna 1 (zawsze <100), zatem jesli chodzi Ci o cos innego tzn. ze nie umiesz tego napisac a prosisz o pomoc winksmiley.jpg
Logicznie rzecz biorac z Twojego postu wynika, ze LIMIT jest tym czego szukasz :/
Aztech
Widać niezbyt precyzyjnie się wyraziłem.
Założenia:
- im większe ID turnieju, tym nowszy to turniej
- tabelkę należy przeglądać od tyłu, czyli od najnowszego turnieju
- należy wybrać dla danej osoby taki zbiór turniejów, w których dana osoba grała, poczynając od najnowszego, aby suma gier dla tych turniejów była nie większa niż 100 (poprzednio nieprecyzyjnie napisałem, że liczna gier).
- rezultatem zapytania może by suma gier (Games) oraz uzyskanych punktów (Scores) dla danego gracza lub też lista gier spełniających w/w warunki
Poniżej przykład ale dla sumy nie większej niż 10 (dodałem rekord ID aby łatwiej się analizowało)
Rekord ID | TournID | PersonID | Score | Games
1 1 10 1500 6
2 1 20 1460 6
3 1 30 1200 5
4 2 10 1436 6
5 2 20 1564 6
6 2 50 950 3
7 3 10 1600 3
8 3 30 1450 4
9 3 40 1200 4
10 3 50 700 2
11 4 10 300 1
12 4 20 600 2
13 4 30 700 2
14 4 40 800 2
15 5 50 700 2
16 5 40 1200 4
17 5 50 1300 4
Dla gracza o id 50 wynik zapytania powinien być następujący
PersonID Sum(Score) Sum(Games)
5 2700 8
lub lista wybranych rekordów o ID
17, 15, 10
Gdyby rekord o ID 6 wyglądał następująco
6 2 50 950 2
również by się załapał ponieważ suma gier (Games) wynosiłaby wtedy 10.
Mam nadzieję, że to będzie w miarę czytelne
prgTW
Aaa no to teraz wszystko jak dla mnie jasne. Pisz procedure/funkcje, z kursora zczytuj kolejne wiersze dopoki beda spelniac warunek

btw: nie prosciej bylo napisac "chce zczytywac kolejne wiersze z tabeli posortowanej malejaco po ID turnieju jednoczesnie liczac sume wartosci w kolumny Games dopoki suma ta bedzie <100" ... grunt to umiec zdefiniowac problem winksmiley.jpg
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.