Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Subquery
Forum PHP.pl > Forum > Bazy danych > MySQL
damianooo
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ć ?
trueblue
  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
damianooo
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.
trueblue
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)).
damianooo
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
trueblue
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ń.
damianooo
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
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.