2012-10-30 34 views
0

對於網站(旅行社),我正在提高性能。目前我正在優化搜索模塊。除其他外,我想優化一個保存目的地的選擇框。在該系統中有幾個目的地,但並非所有目的地都有可預訂的住宿。所以我想要列出至少有1個住宿的目的地。目的地表(表名:地理數據)有4種類型:國家,地區,地區和城市。由於(有點*)不適當的發展,住宿表持有4個外鍵(fk_country,fk_area,fk_region和fk_city)。 *由於每次開發功能時需要增長和收到要求。根據左連接的列值計算行數

我嘗試了以下基於IF語句的左連接。但是這個查詢只做了一半的工作。我最感興趣的是某個國家,地區,地區或城市的住宿數量。此時我只能獲得住宿總數。如何調整此查詢以正確獲取給定位置類型的住宿數量。

我的查詢:

SELECT  geodata.id, 
      geodata.type, 
      COUNT(accommodation.id) AS count_accommodations 
FROM  geodata 
LEFT JOIN accommodation 
ON   IF(geodata.type = 'Country', accommodation.fk_country, 
       IF(geodata.type = 'Area', accommodation.fk_area, 
        IF(geodata.type = 'Region', accommodation.fk_region, accommodation.fk_city) 
       ) 
      ) 
GROUP BY geodata.id 
HAVING  count_accommodations > 0 

電流輸出:

|id|type |count_accommodations| 
--------------------------------- 
| 1|Country|     2| 
| 2|Area |     2| 
| 3|Area |     2| 

預計輸出

|id|type |count_accommodations| 
--------------------------------- 
| 1|Country|     2| 
| 2|Area |     1| 
| 3|Area |     1| 

任何幫助是極大的讚賞。

回答

1

它不起作用,因爲你沒有連接條件。你所做的是評估一個外鍵(fk_country,fk_area,...),但你不會在任何地方使用它。

... 
left join accommodation 
on (... fk_...) = geodata.??? 
group by geodata.id 
... 
+0

哈哈,笨我!謝謝......因爲嵌套的IF,我完全忽略了這個部分。 +1接受。感謝讓我保持敏銳;) – Ben