MySQL学校项目 - 加入的问题

时间:2017-04-16 11:41:53

标签: mysql join

我正在开展一个学校项目,我们的任务是为建筑公司创建一个数据库。我创建了数据库并插入了所有数据。 但是我在解决其中一个所需的查询时遇到了困难。

请注意,所有列和表名都是丹麦语。

我需要创建一个查询,告诉我哪个部门(表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 name = 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 name = 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 |
+---------+-----------+-----+------------+

1 个答案:

答案 0 :(得分:0)

您需要一个子查询来完成此任务。首先,你需要让所有出售一层房屋的部门。你几乎得到了第一个查询,但你没有正确使用内连接语法。您应该使用ON hustype.ModelNr = udbyder.ModelNr,因为ModelNr表中的Udbyder是根据您的表定义引用ModelNr表中HusType的外键。这是正确的查询:

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

您还可以通过以上查询获得销售一层和两层房屋的部门。下一步是获得出售两层房屋的部门的ID。以下查询将执行此操作:

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