Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL] Subquery, Problem ze zliczeniem
damianooo
post 28.10.2017, 23:28:24
Post #1





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

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


W tabeli ze statystykami użytkowników potrzebuję dla każdego pobrać ilość wygranych. Wygrana jest oznaczona w kolumnie position jako 1.

moje przykładowa tabela statistic

user_id ; points ; position
1 ; 23 ; 3
1 ; 25 ; 1
1 ; 20 ; 1
2 ; 21 ; 2
2 ; 22 ; 2
2 ; 26 ; 1
3 ; 19 ; 3
3 ; 21 ; 3
3 ; 24 ; 2


Próbowałem takim podzapytaniem ale zwraca mi przy każdym użytkowniku sumę wszystkich position = 1 a więc 3 a ja chciałem aby policzył ile ma każdy z osobna:

  1. SELECT u.username, sum(s.points), (SELECT count(s.position) FROM statistic s WHERE s.position = 1) AS wins
  2. FROM statistic s
  3. INNER JOIN user u ON s.user_id = u.id
  4. GROUP BY u.username


Jak to powinienem zrobić ?

Ten post edytował damianooo 28.10.2017, 23:29:43
Go to the top of the page
+Quote Post
trueblue
post 29.10.2017, 07:41:21
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


  1. SELECT u.username, SUM(s.points), COUNT(s.position) AS wins
  2. FROM statistic s
  3. INNER JOIN user u ON s.user_id = u.id
  4. WHERE s.position = 1
  5. GROUP BY u.id


--------------------
Go to the top of the page
+Quote Post
damianooo
post 29.10.2017, 20:53:16
Post #3





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

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


zapytanie wylicza faktycznie ile kto ma wygranych ... niestety jednak nie pokazuje mi użytkowników, którzy nie wygrali ani razu sad.gif

poza tym przelicza mi źle inne dane ... ok może pokażę może jakie mam kompletne zapytanie:


  1. SELECT
  2. u.username AS username,
  3. (sum(s.total_points) / sum(s.num_of_que)) AS avgPtsForMatch,
  4. count(u.id) AS seasons,
  5. sum(s.num_of_que) AS numOfQue,
  6. sum(s.total_points) AS totalpoints,
  7. sum(s.match2) AS match2,
  8. sum(s.match4) AS match4
  9. FROM statistic s
  10. INNER JOIN user u ON s.user_id = u.id
  11. GROUP BY u.username
  12. ORDER BY avgPtsForMatch
  13. DESC



do tego brakuje mi teraz przeliczenia dla każdego użytkownika ile ma wygranych (a więc position = 1) ale tak aby Ci co mają zero też byli wyświetlani na liście.

Ten post edytował damianooo 29.10.2017, 21:07:02
Go to the top of the page
+Quote Post
trueblue
post 29.10.2017, 21:07:30
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


LEFT JOIN z tabelą statystyk, aby pokazać wszystkich użytkowników.
Wygrane należy liczyć jeśli position=1, czyli na zasadzie SUM(IF(s.position=1,1,0)).


--------------------
Go to the top of the page
+Quote Post
damianooo
post 29.10.2017, 22:20:39
Post #5





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

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


ehh nie wiem czy dobrze zrozumiałem.

Zrobiłem tak i nie działa:

  1. SELECT
  2. u.username AS username,
  3. (sum(s.total_points) / sum(s.num_of_que)) AS avgPtsForMatch,
  4. count(u.id) AS seasons,
  5. sum(s.num_of_que) AS numOfQue,
  6. sum(s.total_points) AS totalpoints,
  7. sum(s.match2) AS match2,
  8. sum(s.match4) AS match4,
  9. count(s.position) AS wins
  10. FROM user u
  11. LEFT JOIN statistic s ON s.user_id = u.id
  12. WHERE s.position = 1
  13. GROUP BY u.username
  14. ORDER BY avgPtsForMatch
  15. DESC
Go to the top of the page
+Quote Post
trueblue
post 29.10.2017, 22:28:41
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Warunek z WHERE wyrzuć, przecież chcesz wszystkich użytkowników, takich, którzy nie mieli wyników i takich, którzy mieli jakikolwiek.
Dla każdego użytkownika chcesz obliczyć ilość wygranych, więc wyrażenie, które podałem wyżej wstaw do listy pól/wyrażeń.


--------------------
Go to the top of the page
+Quote Post
damianooo
post 30.10.2017, 20:23:41
Post #7





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

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


Dzięki wielkie za pomoc ! Działa !
Proste tylko trzeba potrenować ale tak to jest jak się na co dzień nie pisze za dużo SQLi wink.gif

Tak jest ok:

  1. SELECT
  2. u.username AS username,
  3. (sum(s.total_points) / sum(s.num_of_que)) AS avgPtsForMatch,
  4. count(u.id) AS seasons, sum(s.num_of_que) AS numOfQue,
  5. sum(s.total_points) AS totalpoints,
  6. sum(s.match2) AS match2,
  7. sum(s.match4) AS match4,
  8. sum(if(s.position=1,1,0)) AS wins
  9. FROM user u
  10. LEFT JOIN statistic s ON s.user_id = u.id
  11. GROUP BY u.username
  12. ORDER BY avgPtsForMatch
  13. DESC



pozdrawiam
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 Wersja Lo-Fi Aktualny czas: 26.04.2024 - 08:41