SELECT w.imie, w.nazwisko, samice.samica, samce.samiec FROM ((wlasciciele AS w INNER JOIN (SELECT id_osoby COUNT(plec) AS samiec FROM psy WHERE plec = "samiec" GROUP BY id_osoby) AS samce ON samce.id_osoby = w.id_osoby) INNER JOIN (SELECT id_osoby COUNT(plec) AS samica FROM psy WHERE plec = "samica" GROUP BY id_osoby) AS samice ON samice.id_osoby = w.id_osoby)
Pierwsze lepsze rozwiązanie jakie mi przyszło do głowy
Dobra wytłumaczę Ci wszystko po kolei.
SELECT - wiadomo, wybieramy coś z bazy danych
Co wybieramy?
w.imię, w.nazwisko - kolumny imie i nazwisko, które należą do tabeli właściciele, przy pomocy aliasu (AS) trochę sobie skróciłem zapis z właściciele.imie do w.imie.
samice.samica, samce.samiec - trochę masło maślane, gdyby to zamienić na samica, samiec też byłoby okej (ponieważ nazwy kolumn samiec i samica są unikalne, w przypadku tej kwerendy). Samica to jest liczba samic z tabeli samice, analogicznie samiec.
Skąd tabela samce i samice? To wyjaśnię zaraz.
FROM ((wlasciciele AS w ... - wybieramy dane z następujących tabel wlasciciele..., (to AS w to ten alias o którym wspominałem na początku)
No i teraz, co może nie być oczywiste na początku przygody z sqlem kwerenda może być tabelą z której wybieramy dane (po FROM), i teraz napisałem kwerendy które posłużą jako tabele - samice i samce i je dołączyłem (przy pomocy inner joina.
INNER JOIN - do tabeli wlasciciele dołączamy samce, tak jak wspominałem samce należy traktować jako tabele która ma dwie kolumny id_osoby oraz samiec
(SELECT id_osoby COUNT(plec) AS samiec FROM psy WHERE plec = "samiec" GROUP BY id_osoby) AS samce - ta kwrenda jest w nawiasie (i musi być) bo stanowi to jedną całą tabele którą przy pomocy aliasu (AS samce) nazwałem ją samce. Ta tabela zwraca dwie kolumny id_osoby i samiec. Id_osoby to wiadomo, potrzebujemy tej kolumny z dwóch powodów - 1. Dla każdej osoby liczymy (COUNT(plec)) ile ma psów jakiejś płci - jakiej płci? (WHERE plec = "samiec"). COUNT jest funkcją agregującą i należy wskazać dla jakiej kolumny ma wykonać obliczenia (count liczy rekordy - wiersze), aby to zrobić używamy GROUP BY id_osoby. Wracając.. Drugi ważny powód to potrzebujemy id aby wykonać złączenie
ON samce.id_osoby = w.id_osoby)
W tym momencie mamy właścicieli z ich samcami i dodajemy do tego (przy pomocy inner joina) samice w analogiczny sposób.
Oczywiście zamiast inner joina można użyć bez problemu odpowiedniego warunku po WHERE, kwestia upodobań ;)
Trochę może to być chaotyczne, więc jak coś jest jeszcze niejasne to śmiało pytaj.
93,485 zapytań
142,417 odpowiedzi
322,765 komentarzy
62,898 pasjonatów
Motyw:
Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡
Oto polecana książka warta uwagi.Pełną listę książek znajdziesz tutaj