2009-09-21 53 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表中,只在需要時引用它們。