Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

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





Grupa: Zarejestrowani
Postów: 496
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
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
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
Post #3





Grupa: Zarejestrowani
Postów: 496
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 (IMG:style_emoticons/default/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
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
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
Post #5





Grupa: Zarejestrowani
Postów: 496
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
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
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
Post #7





Grupa: Zarejestrowani
Postów: 496
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 (IMG:style_emoticons/default/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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 19:40