Выборка многоточечных пространственных данных в MySQL - PullRequest
0 голосов
/ 06 октября 2019

Я не нашел ответа, как выбрать каждую точку в многоточечном типе данных в MySQL. У меня есть многоточечная, которая содержит много точек , и я хочу выбрать каждую точку по запросу , и я не могу понять это. Есть идеи?

Структура таблицы: Изображение

Пример данных: Изображение

В документации по MySQL я нашел только это, но этоне помогло: https://dev.mysql.com/doc/refman/8.0/en/fetching-spatial-data.html

1 Ответ

0 голосов
/ 06 октября 2019

Если вы используете MySQL> = 8.0.2, опция может быть такой:

DELIMITER //

CREATE PROCEDURE `sp_test`(`p_id` BIGINT UNSIGNED)
BEGIN
  SET @`sql` := CONCAT('
    WITH RECURSIVE `sequence` AS (
      SELECT 1 `seq`
      UNION ALL
      SELECT `seq` + 1 `seq`
      FROM `sequence`
      WHERE `sequence`.`seq` < ?
    )
    SELECT
      `sequence`.`seq` `id`,
      ST_AsText(ST_GeometryN(`points`, `sequence`.`seq`)) `point`
    FROM `sequence`
      INNER JOIN `tb_test` ON
        `tb_test`.`id` = ', `p_id`);

  SET @`limit` := (
    SELECT
      ST_NumGeometries(`points`)
    FROM
      `tb_test`
    WHERE
      `id` = `p_id`
  );

  PREPARE `stmt` FROM @`sql`;
  EXECUTE `stmt` USING @`limit`;
  DEALLOCATE PREPARE `stmt`;
END//

DELIMITER ;

См. db-fiddle .

ОБНОВЛЕНИЕ

DELIMITER //

CREATE PROCEDURE `sp_test`(`p_id` BIGINT UNSIGNED)
BEGIN
  SET @`sql` := CONCAT('
    WITH RECURSIVE `sequence` AS (
      SELECT 1 `seq`
      UNION ALL
      SELECT `seq` + 1 `seq`
      FROM `sequence`
      WHERE `sequence`.`seq` < ?
    )
    SELECT
      `sequence`.`seq` `id`,
      ST_AsText(ST_GeometryN(`points`, `sequence`.`seq`)) `point`,
      ST_X(ST_GeometryN(`points`, `sequence`.`seq`)) `X`,
      ST_Y(ST_GeometryN(`points`, `sequence`.`seq`)) `Y`
    FROM `sequence`
      INNER JOIN `tb_test` ON
        `tb_test`.`id` = ', `p_id`);

  SET @`limit` := (
    SELECT
      ST_NumGeometries(`points`)
    FROM
      `tb_test`
    WHERE
      `id` = `p_id`
  );

  PREPARE `stmt` FROM @`sql`;
  EXECUTE `stmt` USING @`limit`;
  DEALLOCATE PREPARE `stmt`;
END//

DELIMITER ;

См. db-fiddle .

...