【问题标题】:Combining multiple rows in mysql using CONCAT / GROUP CONCAT使用 CONCAT / GROUP CONCAT 在 mysql 中组合多行
【发布时间】:2012-08-30 20:11:36
【问题描述】:

我有一个非常大的表(几百万条记录)。表中的列说 A 目前是这样的: id, road name, lat, lon 其中id是自增PK。

目前 1 个道路名称在表中可以有多个条目,因为每条道路都映射到多个 (lat, lon) 组合。

我想要做的是将道路名称作为主键,然后删除 lat 和 lon 列。然后添加一个几何类型的列,该列将包含代表道路的(纬度)点列表。

我可以在 java + mysql 中轻松做到这一点,但我想知道是否有一种方法可以通过编写几个嵌套查询来轻松做到这一点?基本上我已经有一个填充表 A 和另一个表 B,其中只有道路名称为 PK 和几何类型的第二列。我想要的是将每个唯一道路名称的所有纬度、经度组合到一个几何点列表并插入到表 B。是否可以在 mysql 中执行此操作?

注意:不要担心道路名称的唯一性,因为这只是一个示例,而不是实际情况。谢谢!

更新:concat/group_concat 函数返回一个字符串。由于我的列类型是几何,我只需将此字符串传递给 MySQL Spatial Extension 中的 GeomFromText() 空间函数以获取几何格式。

【问题讨论】:

    标签: mysql geometry


    【解决方案1】:

    这将用逗号分隔的<lat>x<lon> 对列表填充几何列。

    SELECT road_name, GROUP_CONCAT(CONCAT(lat,'x',lon)) geometry
    FROM road_table
    GROUP BY road_name
    

    【讨论】:

    • 谢谢巴尔玛!简单而有效。我将 Gordon 标记为答案,因为我觉得他的查询对进一步的定制更有帮助。
    【解决方案2】:

    我认为以下查询会满足您的要求:

    select RoadName,
           group_concat(RoadPoint order by id separator ',') as geometry
    from (select A.*,
                 concat('(', lat, ',', long, ')') as RoadPoint
          from A
         ) t
    group by RoadName
    

    这会将列表生成为逗号分隔的子列表,按照点在 A 中出现的顺序。

    【讨论】:

    • 谢谢戈登,正是我想要的。
    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2018-09-02
    • 2016-03-06
    相关资源
    最近更新 更多