Come posso utilizzare le funzioni di gruppo in un spatial JOIN per aggiornare una tabella in MySQL?

0

Domanda

Sto cercando di aggiornare il fatturato totale per uffici in diverse aree geografiche. Le aree geografiche sono definiti da cerchi e poligoni che sono sia nelle forme.forma di colonna.

Quando eseguo la query riportata di seguito, MySQL getta "R_INVALID_GROUP_FUNC_USE: utilizzo non Valido di funzione di gruppo"

Ho cercato di adattare questa risposta, ma io non riesco a capire la logica con la condizionale unirsi e dati geospaziali -- non è semplice come l'aggiunta di una sottoquery con una clausola WHERE. (O è?)

Per il contesto, ho circa 350 aree geografiche e 150.000 uffici.

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

AGGIORNAMENTO:

Questo funziona, ma è lento e confuso. C'è un più veloce/più 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

Migliore risposta

0

Penso che la velocità può essere aiutato da dividere in due UPDATEs:

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

e

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

E poi vedere se la risultante SQLs può essere semplificata.

Per indagare ulteriormente la query, si prega di isolare la subquery b e vedere se la maggior parte del tempo è nel fare che SELECT (rispetto al tempo a fare il UPDATE).

Si prega di fornire SHOW CREATE TABLE per ogni tabella e EXPLAIN per entrambi i UPDATE(s) e l'isolato SELECT(s). Una serie di indizi che potrebbero derivare da tale.

2021-11-17 20:30:29

In altre lingue

Questa pagina è in altre lingue

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