Cum pot folosi grupul de funcții pe un spațiale se ALĂTURE pentru a actualiza un tabel in MySQL?

0

Problema

Încerc să actualizeze veniturile totale pentru birouri situate în diferite zone geografice. Pe zone geografice sunt definite prin cercuri și poligoane care sunt atât în forme.forma de coloana.

Atunci când am rula interogarea de mai jos, MySQL aruncă "R_INVALID_GROUP_FUNC_USE: Invalid utilizarea funcțiilor de grup"

Am încercat să adaptăm acest răspuns, dar nu-mi pot da seama de logica cu condițional și date geospațiale ... nu e la fel de simplu ca adăugarea de o subinterogare cu o clauza where. (Sau este?)

Pentru context, am aproximativ 350 de zone geografice și 150.000 de birouri.

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:

Aceasta funcționează, dar este lent și confuz. Există un mod mai rapid/mai concis?

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

Cel mai bun răspuns

0

Cred că viteza poate fi ajutat prin divizarea în două UPDATEs:

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

și

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

Și apoi a se vedea în cazul în care rezultă sql-urile pot fi simplificate.

Pentru a investiga în continuare de interogare, vă rugăm să izoleze subinterogare b și a vedea dacă cea mai mare parte din timp este în a face asta SELECT (spre deosebire de timpul face UPDATE).

Vă rugăm să furnizați SHOW CREATE TABLE pentru fiecare tabel și EXPLAIN pentru ambele UPDATE(s) și izolate SELECT(s). O serie de indicii ar putea veni dintr-o astfel.

2021-11-17 20:30:29

În alte limbi

Această pagină este în alte limbi

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