Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: liczba zawodników w każdej drużynie + drużyny które mają 0 zawodników
Forum PHP.pl > Forum > Bazy danych > MySQL
djszaki
Witam, proszę o pomoc, muszę podać ilości zawodników wyższych niż 180 cm w poszczególnych drużynach, ale tak, żeby w tabelce istniały wiersze także dla krajów, w których nie ma takich zawodników. W takim wypadku oczywiście w kolumnie oznaczającej liczbę zawodników poniżej 180 cm powinna być wartość 0.

udało mi się wybrać liczbę zawodników w poszczególnej drużynie powyżej 180 cm wzrosu

select kraj, count(wzrost) from zawodnicy where wzrost > 180 group by kraj

ale nie umiem dodać teraz wierszy z drużynami w których brak jest zawodników powyżej 180 cm,

może ktoś pomóc ?
Pyton_000
najprościej UNION
Tomplus
To powinno pomóc, czyli ogólnie łącznie tej samej tabeli tylko z dodatkowym warunkiem wyszkiwania, a potem połączenie współlnym kluczem.

  1. SELECT d.`nation`, d2.countHeight
  2. FROM `footballers` d
  3. LEFT JOIN
  4. (SELECT COUNT(1) countHeight, `nation` FROM `footballers` WHERE `height` >= 180 GROUP BY `NAT`) d2
  5. ON d2.nation = d.nation
  6. GROUP BY d.`nation`;
trueblue
Jeśli masz unikalny klucz (tu id):

  1. SELECT z1.kraj, SUM(z2.wzrost>180)
  2. FROM zawodnicy AS z1
  3. LEFT JOIN zawodnicy AS z2 ON z2.id=z1.id
  4. GROUP BY z1.kraj

djszaki
z tym union pewenie będzie ok, tylko jak tak zrobię:

select kraj, count(wzrost) as liczbaZawodnikow from zawodnicy where wzrost > 180 group by kraj
UNION
select kraj, count(wzrost) as liczbaZawodnikow from zawodnicy where wzrost < 180 group by kraj

to wyświetla mi tak:
kraj liczbaZawodnikow
GER 3
FIN 2
AUT 1
NOR 1

POL 2
GER 2
FIN 1
NOR 2
USA 1

i teraz to drugie zapytanie musi być skonstruowane tak aby wyświetliły się tylko kraje gdzie nie ma zawodnika powyżej 180 cm, a mi wyświetla liczbę zawodników z poniżej 180 cm

myślę o case when then ale to chyba ciężko będzie w tym przypadku

już prawie mam

select kraj, count(wzrost) from zawodnicy where wzrost > 180
group by kraj
union
select kraj, case when wzrost > 180 then 1 when wzrost < 180 then 0 end from zawodnicy
group by kraj

kraj lizczbaZawodnikow
GER 3
FIN 2
AUT 1
NOR 1

POL 0
GER 0
FIN 0
NOR 0
USA 0

tyle ze jeszcze wyswietla niemcy, finladie i norwegie, a tam sa osoby powyżej 180 cm,
próbowałem z distinct(kraj) w drugim zapytaniu ale nie działa


Cytat(trueblue @ 24.02.2019, 21:19:49 ) *
Jeśli masz unikalny klucz (tu id):

  1. SELECT z1.kraj, SUM(z2.wzrost>180)
  2. FROM zawodnicy AS z1
  3. LEFT JOIN zawodnicy AS z2 ON z2.id=z1.id
  4. GROUP BY z1.kraj


to działa, ale nie rozumiem tego do końca, nie rozumiem w którym miejscu zapytania pojawia się wynik kraju gdzie nie występuje zawodnik ze wzrostem powyżej 180
trueblue
Dobrze by było abyś zapoznał się z podstawami (chociażby zasadę działania LEFT JOIN), zanim zaczniesz rozwiązywać trudniejsze zadania.
Tomplus
@djszaki
Próbowałeś to moje rozwiązanie czy pominąłeś?
trueblue
Tomplus,
to jest analogiczne rozwiązanie do mojego, tyle, że delikatnie bardziej skomplikowane. Użyłeś podzapytania gdzie COUNT(1) w połączeniu z LEFT JOIN jest równoważny SUMIF na zewnątrz.
Tomplus
Zgadza się. Tylko żeby jeszcze kolega rozumiał te nasze zapytania smile.gif
djszaki
rozumiem działanie left join, myślałem, że może da się bez left join wykonać
Tomplus
Używanie LEFT JOIN to nie jest powód do wstydu.
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-2024 Invision Power Services, Inc.