Como posso usar funções do grupo em uma junção espacial para atualizar uma tabela no MySQL?

0

Pergunta

Estou tentando atualizar a receita total para escritórios, localizados em diferentes áreas geográficas. As regiões são definidas por círculos e polígonos, que são tanto nas formas.forma de coluna.

Quando eu executo a consulta abaixo, MySQL lança "R_INVALID_GROUP_FUNC_USE: uso Inválido do grupo de função"

Eu tentei adaptar esta resposta, mas eu não consigo descobrir a lógica com a condicional de associação e de dados geoespaciais-não é tão simples como a adição de uma subconsulta com uma cláusula WHERE. (Ou é?)

Para o contexto, tenho cerca de 350 geografias e 150.000 escritórios.

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

ATUALIZAÇÃO:

Isso funciona, mas é lento e confuso. Há mais rápido/mais concisa?

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

Melhor resposta

0

Eu acho que a velocidade pode ser ajudado dividindo-se em duas UPDATEs:

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

e

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

E, em seguida, ver se a resultante SQLs pode ser simplificada.

Para investigar a consulta, por favor, isolar a subconsulta b e veja se a maioria do tempo está em fazer o que SELECT (ao contrário a tempo de fazer o UPDATE).

Por favor, forneça SHOW CREATE TABLE para cada tabela e EXPLAIN para tanto o UPDATE(s) e o isolado SELECT(s). Um número de pistas que podem vir.

2021-11-17 20:30:29

Em outros idiomas

Esta página está em outros idiomas

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