Witam
Mam problem z wyciaganiem danych z wielu tabel i jeśli można to prosiłbym o "łopatologiczne" wytłumaczenie tworzenia takich selectow do wielu tabel. Wiem, ze nalezy skorzystac z JOIN, ale nie do konca wiem w jaki sposob i konczy sie to iloczynem kartezjanskim.
Przykladowe zapytania
1.Podającą wszystkie dane włascicieli oraz ich działek , dla działek położonych w Warszawie
2.Podającą działki które nie mają właścicieli i nie leżą w Warszawie
3.Podającą dane mapy (nrmapy,polozenie), oraz liczbę i łączną powierzchnię działek na tych mapach
4.Podającą dane właścicieli, mających co najmniej 2 działki
TABELE:
dzialki | CREATE TABLE `dzialki` (
`NrDzialki` char(20) NOT NULL,
`Rodzaj` char(20) DEFAULT NULL,
`NrMapy` int(3) DEFAULT NULL,
`Powierzchnia` decimal(7,2) DEFAULT NULL,
PRIMARY KEY (`NrDzialki`)
mapy | CREATE TABLE `mapy` (
`NrMapy` int(3) NOT NULL DEFAULT '0',
`Polozenie` varchar(200) DEFAULT NULL,
PRIMARY KEY (`NrMapy`)
wlasciciele | CREATE TABLE `wlasciciele` (
`Wlasciciel` varchar(100) DEFAULT NULL,
`Miasto` varchar(100) DEFAULT NULL,
`Adres` varchar(100) DEFAULT NULL,
`DataUrodz` date DEFAULT NULL,
`Pesel` char(11) NOT NULL,
PRIMARY KEY (`Pesel`)
wlasnosc | CREATE TABLE `wlasnosc` (
`NrDzialki` char(20) NOT NULL,
`Pesel` char(11) NOT NULL DEFAULT '',
`Udzial` float(6,4) DEFAULT NULL,
PRIMARY KEY (`Pesel`,`NrDzialki`),
KEY `NrDzialki` (`NrDzialki`),
CONSTRAINT `wlasnosc_ibfk_2` FOREIGN KEY (`NrDzialki`) REFERENCES `dzialki` (`NrDzialki`),
CONSTRAINT `wlasnosc_ibfk_1` FOREIGN KEY (`Pesel`) REFERENCES `wlasciciele` (`Pesel`)
Probowałem zrobic kilka zapytan, ale np w przypadku 1, wynikiem byl iloczyn kartezjanski tabel:
SELECT w.*,d.* FROM wlasciciele w INNER JOIN dzialki d LEFT JOIN mapy m ON d.NrMapy=m.NrMapy WHERE m.Polozenie="Warszawa";
*edit
Udalo mi sie zrobic 1 i 2 select, jednak mam problemy z 3 i 4:
1.SELECT w.*,d.* FROM wlasciciele w LEFT JOIN wlasnosc wl USING(Pesel) INNER JOIN dzialki d USING(NrDzialki) INNER JOIN mapy m USING(NrMapy) WHERE m.Polozenie="Warszawa"
2.SELECT d.* FROM dzialki d LEFT JOIN wlasnosc wl USING(NrDzialki) INNER JOIN wlasciciele w USING (Pesel) INNER JOIN mapy m USING(NrMapy) WHERE Pesel IS NULL AND Polozenie!='Warszawa'
3.SELECT m.*,COUNT(d.NrDzialki), SUM(d.Powierzchnia) FROM dzialki d LEFT OUTER JOIN mapy m USING(NrMapy)--zwraca wyniki dla tylko jednej mapy, zamiast wszystkich