0

对于一个网站(旅行社),我正在努力提高性能。目前我正在优化搜索模块。除其他外,我想优化一个包含目的地的选择框。系统中有多个目的地,但并非所有目的地都有可预订的住宿。所以我想要至少有 1 个住宿的目的地列表。目的地表(表名:geodata)包含 4 种类型:Country、Area、Region 和 City。由于(某种*)开发不当,住宿表包含 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|

任何帮助是极大的赞赏。

4

1 回答 1

1

它不起作用,因为您没有加入条件。你所做的是,评估一个外键(fk_country,fk_area,...),但你不在任何地方使用它。

...
left join accommodation
on (... fk_...) = geodata.???
group by geodata.id
...
于 2012-10-30T22:10:22.510 回答