根据左联接中的列值计算行数

根据左联接中的列值计算行数

对于一个网站(旅行社),我正在努力提高性能。目前,我正在优化搜索模块。除其他外,我想优化保存目标的选择框。在系统中,有多个目的地,但并非所有目的地都有可预订的住宿。因此,我想获得至少有1个住宿地点的目的地清单。 Destinations表(表名: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|


任何帮助是极大的赞赏。

最佳答案

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

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

关于mysql - 根据左联接中的列值计算行数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13148060/

10-10 22:48