【问题标题】:Count number of rows based on a column value from a left join根据左连接中的列值计算行数
【发布时间】:2012-10-30 21:47:54
【问题描述】:

对于一个网站(旅行社),我正在努力提高性能。目前我正在优化搜索模块。除其他外,我想优化一个包含目的地的选择框。系统中有多个目的地,但并非所有目的地都有可预订的住宿。所以我想要至少有 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|

非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 哈哈,愚蠢的我!谢谢...由于嵌套的IF,我完全忽略了那部分。 +1 接受。谢谢你让我保持敏锐;)
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2011-01-12
    相关资源
    最近更新 更多