我有桌子房间,公寓和酒店。现在,通过使用单独的查询,我可以轻松获得所有免费房间,酒店地址名称或公寓相同的内容:
获取所有免费房间:
SELECT hotel.name, count(*) AS num_of_free_rooms
FROM hotel, rooms
WHERE rooms.occupied !=0
AND hotel.hotel_id = rooms.room_hotel
GROUP BY hotel.hotel_id
获取所有免费公寓:
SELECT hotel.name, count(*) AS num_of_free_ap
FROM hotel, apartments
WHERE apartments.occupied_ap !=0
AND hotel.hotel_id = apartments.apartment_hotel
GROUP BY hotel.hotel_id
我怎么能得到这样的结果:
酒店名称| 0 |以外的免费房间数量公寓数量0或任何其他
我是否应该以不同的方式组织我的数据,例如在表格中添加房间类型1表示房间,2表示公寓或者使用单独的表格。我愿意接受任何建议,以获得我需要的结果。
答案 0 :(得分:2)
如果您在单独的表格中有房间和公寓,并且您尝试在单个查询中计算它们,您将在房间和公寓之间生成所谓的笛卡儿产品。结果是你的每个人的数量都会高于现实(他们会成倍增加)。
请记住,您不必使用单个查询解决SQL中的所有问题!运行单独的查询更简单,并且通常比单个过于复杂的查询运行得更快。所以不要忽视简单地运行两个查询的选项。
也就是说,如果我正在设计这个数据库,我会将房间和公寓作为同一个表的一部分,并使用属性来区分这两种类型,就像你描述的那样。除非您需要大量特定于某种类型或其他类型的列。
有关更多选项,请参阅“Product table, many kinds of product, each product has many parameters。”中的回答。
答案 1 :(得分:1)
您可以使用此功能,直到有人提出(更有效)解决方案:)
SELECT tmp.name, tmp.num_of_free_rooms, num_of_free_ap
FROM
(SELECT hotel.name, count(*) AS num_of_free_rooms
FROM hotel, rooms
WHERE rooms.occupied !=0
AND hotel.hotel_id = rooms.room_hotel
GROUP BY hotel.hotel_id) AS tmp
LEFT JOIN
(SELECT hotel.name, count(*) AS num_of_free_ap
FROM hotel, apartments
WHERE apartments.occupied_ap !=0
AND hotel.hotel_id = apartments.apartment_hotel
GROUP BY hotel.hotel_id) AS tmp2
ON tmp1.hotel.name = tmp2.hotel_name
WHERE tmp.num_of_free_rooms > 0
答案 2 :(得分:0)
如果房间和公寓共享许多属性,则值得将它们放在同一个表中(带有标记),以简化您提到的查询。您可以将特殊属性放在room_details
和apt_details
表中,并在需要时仅引用它们。