Jak mogę korzystać z grupowe funkcje w przestrzennym połączenia do aktualizacji tabeli w MySQL?

0

Pytanie

Próbuję zaktualizować ogólną ratunek dla biur, zlokalizowanych w różnych regionach geograficznych. Obszary geograficzne określone w kółko i wielokątami, które znajdują się w kolumnie shapes.shape.

Kiedy wykonuję zapytanie poniżej, MySQL podaje "R_INVALID_GROUP_FUNC_USE: Nieprawidłowe korzystanie z funkcji grupy".

Próbowałem dostosować odpowiedź, ale nie mogę zrozumieć logiki warunkowego połączenia i geoprzestrzennych danych-to nie jest tak proste, jak dodać podzapytanie z ofertą WHERE. (Czy to prawda?)

Dla kontekstu u mnie około 350 obszarów geograficznych i 150 000 biur.

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

Odśwież:

To działa, ale powoli i mylące. Czy jest szybszy/bardziej przejrzysty sposób?

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

Najlepsza odpowiedź

0

Myślę, że tej prędkości można pomóc, podzielone na dwie UPDATEs:

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

i

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

A następnie zobacz, czy można uprościć otrzymane SQLS.

Do dalszej nauki zapytania, proszę, wskaż podzapytanie b i zobacz, poświęca się czy jest na to duża część czasu SELECT (w odróżnieniu od czasu poświęconego na UPDATE).

Proszę podać SHOW CREATE TABLE dla każdego stołu i EXPLAIN dla obu UPDATE(s) i na białym tle SELECT(s). Z tego może wynikać szereg podpowiedzi.

2021-11-17 20:30:29

W innych językach

Ta strona jest w innych językach

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