¿Cómo puedo utilizar las funciones de grupo en una unión espacial para actualizar una tabla en MySQL?

0

Pregunta

Estoy tratando de actualizar el total de ingresos para sus oficinas ubicadas en distintas zonas geográficas. Las geografías son definidos por los círculos y polígonos que están tanto en las formas.forma de columna.

Cuando ejecuto la consulta a continuación, MySQL lanza "R_INVALID_GROUP_FUNC_USE: uso no Válido de la función de grupo"

He intentado adaptar esta respuesta, pero no puedo entender la lógica con la condicional unirse y datos geoespaciales -- no es tan simple como añadir una subconsulta con una cláusula where. (O es?)

Para el contexto, tengo unos 350 geografías y 150.000 oficinas.

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);

ACTUALIZACIÓN:

Esto funciona, pero es lento y confuso. Hay una más rápida/más conciso?

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

Mejor respuesta

0

Creo que la velocidad puede ser ayudado por la división en dos UPDATEs:

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

y

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

Y luego ver si el resultado Sql puede ser simplificado.

Para investigar más a fondo la consulta, por favor aislar la subconsulta b y a ver si la mayor parte del tiempo está en hacer que SELECT (en contraposición a la hora de hacer el UPDATE).

Por favor proporcione SHOW CREATE TABLE para cada tabla y EXPLAIN por tanto la UPDATE(s) y el aislado SELECT(s). Un número de pistas puede provenir de tales.

2021-11-17 20:30:29

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................