2009-09-21 55 views
1

我有一个表房间,公寓和酒店。现在,它容易让我通过使用单独的查询前得到所有免费客房,酒店地址或同样的事情公寓的名字:Mysql加入表问题

获取所有免费客房:

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

比约恩解决方案在哪里消失我正要接受.. – ant 2009-09-21 19:25:45

回答

2

如果您将房间和公寓放在单独的表格中,并且您尝试在单个查询中对它们进行计数,那么您将在房间和公寓之间生成所谓的笛卡尔产品。其效果是你每个人的数量都会远高于现实(他们会相乘)。

请记住,您不必通过单个查询来解决SQL中的每个问题!运行单独的查询更简单,而且运行速度通常比单个过于复杂的查询快。所以不要忽略简单地运行两个查询的选项。这就是说,如果我设计这个数据库,我会让房间和公寓成为同一张桌子的一部分,并使用属性来区分这两种类型,就像你所描述的一样。除非你需要很多特定于一种或另一种类型的列。

有关更多选项,请参阅我在“Product table, many kinds of product, each product has many parameters”中的答案。

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 
0

如果客房和公寓有许多共同特征,这是值得把他们都在同一个表(带标志)只是为了简化您提到的问题。您可以将特殊属性放在room_detailsapt_details表中,只在需要时引用它们。