Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> liczba zawodników w każdej drużynie + drużyny które mają 0 zawodników
djszaki
post 24.02.2019, 20:41:04
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 22.07.2017

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


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 ?
Go to the top of the page
+Quote Post
Pyton_000
post 24.02.2019, 20:46:39
Post #2





Grupa: Zarejestrowani
Postów: 7 784
Pomógł: 1369
Dołączył: 26.10.2005

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


najprościej UNION
Go to the top of the page
+Quote Post
Tomplus
post 24.02.2019, 21:09:27
Post #3





Grupa: Zarejestrowani
Postów: 1 391
Pomógł: 164
Dołączył: 20.03.2005
Skąd: Będzin

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


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`;
Go to the top of the page
+Quote Post
trueblue
post 24.02.2019, 21:19:49
Post #4





Grupa: Zarejestrowani
Postów: 5 413
Pomógł: 1486
Dołączył: 11.03.2014

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


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



--------------------
Go to the top of the page
+Quote Post
djszaki
post 24.02.2019, 23:25:36
Post #5





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 22.07.2017

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


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
Go to the top of the page
+Quote Post
trueblue
post 25.02.2019, 08:12:57
Post #6





Grupa: Zarejestrowani
Postów: 5 413
Pomógł: 1486
Dołączył: 11.03.2014

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


Dobrze by było abyś zapoznał się z podstawami (chociażby zasadę działania LEFT JOIN), zanim zaczniesz rozwiązywać trudniejsze zadania.


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 25.02.2019, 11:01:06
Post #7





Grupa: Zarejestrowani
Postów: 1 391
Pomógł: 164
Dołączył: 20.03.2005
Skąd: Będzin

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


@djszaki
Próbowałeś to moje rozwiązanie czy pominąłeś?
Go to the top of the page
+Quote Post
trueblue
post 25.02.2019, 11:45:28
Post #8





Grupa: Zarejestrowani
Postów: 5 413
Pomógł: 1486
Dołączył: 11.03.2014

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


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.


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 25.02.2019, 16:22:13
Post #9





Grupa: Zarejestrowani
Postów: 1 391
Pomógł: 164
Dołączył: 20.03.2005
Skąd: Będzin

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


Zgadza się. Tylko żeby jeszcze kolega rozumiał te nasze zapytania smile.gif
Go to the top of the page
+Quote Post
djszaki
post 25.02.2019, 21:52:22
Post #10





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 22.07.2017

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


rozumiem działanie left join, myślałem, że może da się bez left join wykonać
Go to the top of the page
+Quote Post
Tomplus
post 26.02.2019, 06:51:39
Post #11





Grupa: Zarejestrowani
Postów: 1 391
Pomógł: 164
Dołączył: 20.03.2005
Skąd: Będzin

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


Używanie LEFT JOIN to nie jest powód do wstydu.
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: 17.06.2019 - 16:40