Как я могу использовать групповые функции в пространственном соединении для обновления таблицы в MySQL?

0

Вопрос

Я пытаюсь обновить общую выручку для офисов, расположенных в разных географических регионах. Географические области определяются кругами и многоугольниками, которые находятся в столбце shapes.shape.

Когда я выполняю запрос ниже, MySQL выдает "R_INVALID_GROUP_FUNC_USE: Недопустимое использование функции группы".

Я попытался адаптировать этот ответ, но я не могу понять логику условного соединения и геопространственных данных-это не так просто, как добавить подзапрос с предложением WHERE. (Или это так?)

Для контекста у меня около 350 географических районов и 150 000 офисов.

UPDATE
    shapes s
    LEFT JOIN offices ON (
        CASE
            WHEN s.type = 'circle' THEN ST_Distance_Sphere(o.coords, s.shape) < s.radius
            ELSE ST_CONTAINS(s.shape, o.coords)
        END
    )
SET
    s.totalRevenue = SUM(o.revenue);

Обновить:

Это работает, но медленно и сбивает с толку. Есть ли более быстрый/лаконичный способ?

UPDATE
    shapes s
    LEFT JOIN (
        SELECT
            t.shape_id,
            SUM(g.revenue) revenue
        FROM
            shapes t
            LEFT JOIN offices o ON (
                CASE
                    WHEN t.type = 'circle' THEN ST_Distance_Sphere(o.coords, t.shape) < t.radius
                    ELSE ST_CONTAINS(t.shape, o.coords)
                END
            )
        GROUP BY
            t.shape_id
    ) b ON s.shape_id = b.shape_id
SET
    s.totalRevenue = b.revenue;
case left-join mysql spatial-query
2021-11-17 03:21:30
1

Лучший ответ

0

Я думаю, что этой скорости можно помочь, разделившись на две UPDATEs:

... WHERE t.type = 'circle' 
      AND ST_Distance_Sphere ...

и

... WHERE t.type != 'circle' 
      AND ST_CONCAINS ...

А затем посмотрите, можно ли упростить полученные SQLS.

Для дальнейшего изучения запроса, пожалуйста, выделите подзапрос b и посмотрите, тратится ли на это большая часть времени SELECT (в отличие от времени, затрачиваемого на UPDATE).

Пожалуйста, предоставьте SHOW CREATE TABLE для каждого стола и EXPLAIN для обоих UPDATE(s) и изолированные SELECT(s). Из этого может вытекать целый ряд подсказок.

2021-11-17 20:30:29

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................