Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> sql - problem z zapytaniem, zagadka
damianooo
post
Post #1





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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


Go to the top of the page
+Quote Post
tehaha
post
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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.

Ten post edytował tehaha 4.05.2012, 11:19:34
Go to the top of the page
+Quote Post
damianooo
post
Post #3





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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ąć

Ten post edytował damianooo 4.05.2012, 11:38:07
Go to the top of the page
+Quote Post
tehaha
post
Post #4





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
damianooo
post
Post #5





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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


Ten post edytował damianooo 4.05.2012, 12:07:45
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Przenoszę do "Bazy danych".
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 08:42