基本SQL SUM和JOIN

时间:2017-01-08 17:19:49

标签: sql request

我对SQL及其关联有点迷茫。 我有两张桌子“酒店”“房间”

在我的会议室表中,我有一个名为“hotel_id”的字段,“容量”“book” 在我的酒店表中,我有一个字段“name”

我的“book”字段是布尔值,因此如果它是“0”则表示它是免费的,如果它是“1”它被预订了。

我的主要目标是根据免费客房显示酒店名称和免费容量,如下所示:

名称

COSTA DEL SOL

容量

35

(它意味着是一个有两列的表)

所以我开始写这个:

SELECT * FROM room WHERE book = "0";

给了我所有免费房间。

然后我写了这个:

SELECT hotel_id, SUM(capacity) FROM room WHERE book = "0" GROUP BY hotel_id;

这给了我所有酒店的所有容量ID和

然后我写道:

SELECT name, hotel_id FROM hotel INNER JOIN room ON hotel.id = room.hotel_id GROUP BY name;

给我酒店名称及其ID。

因此,通过结合 sum join 的请求,我有点迷失了。我无法弄清楚如何让它发挥作用。

我试过这个,但没有成功:

SELECT name, hotel_id, sum(capacity) AS hotelcapacity FROM hotel
INNER JOIN room ON hotel.id = room.hotel_id GROUP BY hotelcapacity;

如果有人能帮助我,我将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:2)

为什么要对酒店容量进行分组而不是id和名称,如:

SELECT h.name, r.hotel_id, sum(r.capacity) AS hotelcapacity 
FROM hotel h INNER JOIN room r
ON h.id = r.hotel_id 
GROUP BY h.name, r.hotel_id

要获得免费房间的容量,您可以使用以下查询:

SELECT h.name, r.hotel_id, sum(r.capacity) AS hotelcapacity 
FROM hotel h INNER JOIN room r
ON h.id = r.hotel_id 
WHERE r.book = "0" 
GROUP BY h.name, r.hotel_id

答案 1 :(得分:2)

您需要按酒店名称分组,而不是按容量分组。您也可以从查询中排除酒店ID。

类似的东西:

SELECT name, SUM(capacity) AS hotelcapacity 
FROM hotel
INNER JOIN room ON hotel.id = room.hotel_id 
GROUP BY name;

如果您在查询中需要酒店ID,则可以通过以下方式将其添加到组:

SELECT name, hotel_id, SUM(capacity) AS hotelcapacity 
FROM hotel
INNER JOIN room ON hotel.id = room.hotel_id 
GROUP BY name, hotel_id;

答案 2 :(得分:1)

您的最终查询需要按右栏聚合:

SELECT h.name, r.hotel_id, sum(r.capacity) AS hotelcapacity
FROM hotel h LEFT JOIN
     room r
     ON h.id = r.hotel_id
     WHERE r.book = "0"
GROUP BY h.name, r.hotel_id;

我还将JOIN更改为左连接,以防某些酒店在room表中没有空间。

我还介绍了表别名。你应该养成使用这些的习惯。表名的缩写是最好的。并且,您应该在引用列时使用表别名(两者都是为了澄清代码并防止编译器错误)。