我对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;
如果有人能帮助我,我将不胜感激。谢谢。
答案 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
表中没有空间。
我还介绍了表别名。你应该养成使用这些的习惯。表名的缩写是最好的。并且,您应该在引用列时使用表别名(两者都是为了澄清代码并防止编译器错误)。