2017-04-16 31 views
1

我正在學校項目中,我們負責爲建築公司創建數據庫。我創建了數據庫並插入了我的所有數據。 但我有困難解決其中一個需要的查詢。MySQL學校項目 - 加入問題

請注意,所有列和表名都是丹麥語。

我需要創建一個查詢,告訴我哪個部門(表Afdelinger.id)只銷售一層樓的房屋(表HusType.Etageantal)。只有一個部門這樣做,那是07部(AfdId)。

無論我如何創建查詢,我總是會得到所有銷售一層樓的部門或沒有任何東西,但這些部門也銷售2層樓的房屋。所以我的查詢只能輸出AfdId 07. 我想這些質疑,但他們都沒有給我正確的結果

select etageantal, id, udbyder.ModelNr from hustype 
inner join udbyder 
on id = id 
where Etageantal like 1 = Etageantal not like 2 
group by id; 

select * from hustype 
left join udbyder on hustype.modelnr = udbyder.modelnr 
where Etageantal like 1 
union 
select * from hustype 
right outer join udbyder on hustype.modelnr = udbyder.modelnr 
where Etageantal like 1 
order by id; 

UdbyderHusTypeAfdelinger結合表。

Create table Afdelinger(
AfdId int not null, 
Navn varchar(45) not null, 
PostNr int not null, 
primary key(AfdId), 
foreign key(PostNr) references PostNummer(PostNr) 
) ENGINE=INNODB; 


Create Table HusType(
ModelNr int(3) not null, 
ModelNavn varchar(10) not null, 
Kvm int(3) not null, 
Etageantal int(1) not null, 
primary key(ModelNr) 
) ENGINE=INNODB; 


Create table Udbyder(
HusPrisAfd decimal not null, 
Id int not null, 
ModelNr int(3) not null, 
primary key(HusPrisAfd, Id), 
unique(HusPrisAfd), 
foreign key(Id) references Afdelinger(AfdId), 
foreign key(ModelNr) references HusType(ModelNr) 
) ENGINE=INNODB; 

這裏是我的數據

表名= Afdelinger

+-------+---------------------+--------+ 
| AfdId | Navn    | PostNr | 
+-------+---------------------+--------+ 
|  1 | Herning    | 7400 | 
|  2 | Brønderslev   | 9800 | 
|  3 | Haderslev   | 6100 | 
|  4 | Højbjerg   | 8270 | 
|  5 | Brabrand   | 8220 | 
|  6 | Fyn     | 5000 | 
|  7 | Sjælland og Øerne | 4000 | 
+-------+---------------------+--------+ 

TBL名= Udbyder

+------------+----+---------+ 
| HusPrisAfd | Id | ModelNr | 
+------------+----+---------+ 
| 1175000 | 2 |  102 | 
| 1250000 | 1 |  100 | 
| 1275000 | 2 |  103 | 
| 1350000 | 1 |  101 | 
| 1375000 | 2 |  104 | 
| 1450000 | 1 |  102 | 
| 1550000 | 1 |  103 | 
| 1575000 | 3 |  100 | 
| 1600000 | 3 |  102 | 
| 1650000 | 2 |  100 | 
| 1675000 | 3 |  101 | 
| 1700000 | 3 |  103 | 
| 1750000 | 2 |  101 | 
| 1800000 | 3 |  104 | 
| 1941666 | 4 |  102 | 
| 1978508 | 4 |  103 | 
| 2000000 | 4 |  100 | 
| 2015350 | 5 |  101 | 
| 2052192 | 5 |  102 | 
| 2089035 | 5 |  103 | 
| 2100000 | 4 |  101 | 
| 2125877 | 5 |  104 | 
| 2199561 | 6 |  100 | 
| 2236403 | 6 |  101 | 
| 2273245 | 6 |  102 | 
| 2310087 | 6 |  103 | 
| 2346929 | 6 |  104 | 
| 2420614 | 7 |  102 | 
+------------+----+---------+ 

TBL名= Hustype

+---------+-----------+-----+------------+ 
| ModelNr | ModelNavn | Kvm | Etageantal | 
+---------+-----------+-----+------------+ 
|  100 | H-Huset | 167 |   1 | 
|  101 | U-Huset | 176 |   1 | 
|  102 | L-Huser | 193 |   1 | 
|  103 | Skagen | 212 |   2 | 
|  104 | Funkis | 242 |   2 | 
+---------+-----------+-----+------------+ 

回答

0

您需要一個子查詢來完成此操作。首先,你需要讓所有部門出售一棟樓房。您幾乎可以在第一次查詢時獲得它,但是您沒有正確使用內部連接語法。您應該使用ON hustype.ModelNr = udbyder.ModelNr,因爲ModelNrUdbyder表中是根據您的表定義引用ModelNrHusType表中的外鍵。以下是正確的查詢:

SELECT hustype.etageantal, udbyder.id, udbyder.ModelNr 
FROM hustype 
INNER JOIN udbyder 
ON hustype.ModelNr = udbyder.ModelNr 
WHERE hustype.Etageantal = 1 

您還會得到部門同時出售一層樓和兩層樓房屋的上述查詢。下一步是獲得銷售兩層樓房的部門的編號。下面的查詢將這樣做:

SELECT udbyder.id 
FROM hustype 
INNER JOIN udbyder 
ON hustype.ModelNr = udbyder.ModelNr 
WHERE Etageantal <> 1 

從上述查詢獲得的結果應該從第一個查詢的結果中消除。您可以通過使用NOT IN將上述查詢作爲子查詢插入到第一個查詢的where條件中來完成。下面是最終的查詢將返回各部門只賣一層樓的房子:

SELECT hustype.etageantal, udbyder.id, udbyder.ModelNr 
FROM hustype 
INNER JOIN udbyder 
ON hustype.ModelNr = udbyder.ModelNr 
WHERE hustype.Etageantal = 1 
AND udbyder.id NOT IN 
(
    SELECT udbyder.id 
    FROM hustype 
    INNER JOIN udbyder 
    ON hustype.ModelNr = udbyder.ModelNr 
    WHERE Etageantal <> 1 
); 

SQLFiddle演示:http://sqlfiddle.com/#!9/6ec673/13

+0

你剛纔救了我的天,並幫助我更好地瞭解如何加入工作。非常感謝 –