Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sql - problem z zapytaniem
Forum PHP.pl > Forum > Bazy danych
damianooo
Witam ,


Mam taki oto problem:

Są trzy tabele:

Gracz(numer,nazwa)
Punkty(id,punkty,id_gracz)
Stat(id,punkty_2,punkty_4,id_gracz)


Mam takie danew nich:
Gracz(1,'Damian'),(2,'Wojtek'),(3,'Mateusz'),(4,'Marcin')
Punkty(1,12,1)(2,20,1) (3,8,2)(4,22,2) (5,16,3)(6,24,3) (7,10,4)(8,10,4)
Stat(1,51,11,1)(2,55,11,1) (3,59,14,2)(4,57,19,2) (5,43,17,3)(6,69,9,3) (7,59,10,4)

Uwaga! w tabeli Stat jest tylko jeden rekord dla gracza id=4 , dla pozostałych po 2 . Natomiast w tabeli punkty ten sam gracz ma dwa rekordy tak samo jak pozostali !




I teraz tak, potrzebuję pogrupować wyniki zapytania po nazwie gracza.

Wykonując to zapytanie:

  1. SELECT gracz.nazwa, stat.punkty_2,stat.punkty_4, sum(punkty.punkty) AS pkt
  2. FROM gracz
  3. INNER JOIN punkty
  4. ON gracz.numer = punkty.id_gracz
  5. INNER JOIN stat
  6. ON (punkty.id_gracz = stat.id_gracz) AND (gracz.numer = stat.id_gracz)
  7. GROUP BY gracz.nazwa,stat.punkty_2,stat.punkty_4


otrzymuję wyniki podwójnie, oprócz gracza Marcin, który w tabeli Stat ma tylko jeden rekord:

Damian,51,11,32
Damian,55,11,32
Marcin,59,10,20
Mateusz,43,17,40
Mateusz,69,9,40
Wojtek,59,19,30
Wojtek,59,14,30

dlaczego ?

proszę o podpowiedź,

bo domyślam się że w moim zapytaniu jest byk, albo czegoś tam jeszcze brakuje,,

dzięki


tehaha
Cytat
otrzymuję wyniki podwójnie, oprócz gracza Marcin, który w tabeli Stat ma tylko jeden rekord:

Cytat
dlaczego ?

proszę o podpowiedź,

Sam sobie odpowiedziałeś na to pytanie:
Cytat
w tabeli Stat jest tylko jeden rekord dla gracza id=4 , dla pozostałych po 2 . Natomiast w tabeli punkty ten sam gracz ma dwa rekordy tak samo jak pozostali !

Zrobiłeś INNER JOIN, czyli wszystkie wyniki zostają dopasowane, w tabeli stat masz po 2 rekordy, które mają to samo ID gracza, więc te same dane z tabeli gracza zostają dwa razy dołączone. Nie da się nic więcej powiedzieć bo nie wiem czego oczekiwałeś, jeżeli chcesz, żeby gracze się nie dublowali to musisz użyć GROUP BY gracz_id.
damianooo
rozumiem, że chodzi Ci o taką konstrukcję:

  1. SELECT gracz.numer, gracz.nazwa, stat.punkty_2, stat.punkty_4, sum( punkty.punkty ) AS pkt
  2. FROM gracz
  3. INNER JOIN punkty ON gracz.numer = punkty.id_gracz
  4. INNER JOIN stat ON (punkty.id_gracz = stat.id_gracz) AND (gracz.numer = stat.id_gracz)
  5. GROUP BY gracz.numer, gracz.nazwa, stat.punkty_2, stat.punkty_4
  6. ORDER BY pkt DESC




jednak nadal rekordy się powielają


dodałem do zapytania jeszcze ORDER BY pkt DESC żeby było widać na czym mi tutaj najbardziej zależy.
Dokładniej: "chcę wyświetlać graczy posortowanych wg. sumy punktów z tabeli PUNKTY dlatego jest sum(punkty.punkty) ale dodatkowo chcę wyświetlać dla każdego gracza dane z jego statystykami z tabeli STAT








ok już wiem co robiłem nie tak

zapomniałem dodać że w tabeli STAT znajduje się jeszcze pole o nazwie "sezon" oznaczające numer sezonu. I jasne jest że dane do statystyki będą wyświetlane dla konkretnego sezonu. Bo trudno żeby mi się rekordy nie powieliły jak nie dam warunku WHERE na numer zesonu z którego mają być dane.

Dlatego jak zapytanie zrobię tak:

  1. SELECT gracz.nazwa, stat.punkty_2, stat.punkty_4, sum( punkty.punkty ) AS pkt
  2. FROM gracz
  3. INNER JOIN punkty ON gracz.numer = punkty.id_gracz
  4. INNER JOIN stat ON ( punkty.id_gracz = stat.id_gracz )
  5. AND (
  6. gracz.numer = stat.id_gracz
  7. )
  8. WHERE stat.sezon = 2
  9. GROUP BY gracz.nazwa, stat.punkty_2, stat.punkty_4
  10. ORDER BY pkt DESC



to dane wyświetlą mi się tak jak tego oczekiwałem


dzięki za próbę pomocy i sorry za nie dokładne dane do analizy

temat można zamknąć
tehaha
w tym wypadku wystarczy grupowanie tylko po id, czyli numerze gracza, dodatkowo ten pierwszy warunek w drugim JOIN wydaje mi się mało sensowny, spróbuj tak:
  1. SELECT gracz.numer, gracz.nazwa, stat.punkty_2, stat.punkty_4, sum( punkty.punkty ) AS pkt
  2. FROM gracz
  3. INNER JOIN punkty ON gracz.numer = punkty.id_gracz
  4. INNER JOIN stat ON gracz.numer = stat.id_gracz
  5. GROUP BY gracz.numer
  6. ORDER BY pkt DESC
damianooo
wszystko fajnie , tylko nie zapominaj że numer sezonu jest tutaj ważny a więc potrzeba jeszcze WHERE. Poza tym bez tego ID


  1. SELECT gracz.nazwa, stat.punkty_2, stat.punkty_4, sum( punkty.punkty ) AS pkt
  2. FROM gracz
  3. INNER JOIN punkty ON gracz.numer = punkty.id_gracz
  4. INNER JOIN stat ON gracz.numer = stat.id_gracz
  5. WHERE stat.sezon =2
  6. GROUP BY gracz.nazwa
  7. ORDER BY pkt DESC
phpion
Przenoszę do "Bazy danych".
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.