根据左连接的列值计算行数

时间:2012-10-30 21:47:54

标签: mysql join if-statement group-by having-clause

对于一个网站(旅行社),我正致力于提升绩效。目前我正在优化搜索模块。除此之外,我想优化一个保存目的地的选择框。在该系统中有几个目的地,但并非所有目的地都有可预订的住宿。所以我希望列出至少有1个住宿的目的地。目的地表(tablename:geodata)包含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 个答案:

答案 0 :(得分:1)

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

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