Comment puis-je utiliser des fonctions de groupe sur une JOINTURE spatiale pour mettre à jour une table dans MySQL?

0

La question

Je suis en train de mettre à jour le total des revenus pour les bureaux situés dans des zones géographiques différentes. Les zones géographiques sont définies par des cercles et des polygones qui sont à la fois dans les formes.la forme de la colonne.

Lorsque j'exécute la requête ci-dessous, MySQL jette "R_INVALID_GROUP_FUNC_USE: utilisation incorrecte de la fonction de groupe"

J'ai essayé d'adapter cette réponse, mais je ne peux pas comprendre la logique de la condition de jointure et de données géospatiales -- ce n'est pas aussi simple que l'ajout d'une sous-requête avec une clause where. (Ou est-il?)

Pour le contexte, j'ai environ 350 zones géographiques et 150 000 les bureaux.

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

Mise à JOUR:

Cela fonctionne, mais c'est lent et confus. Est-il plus rapide/plus 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

La meilleure réponse

0

Je pense que la vitesse peut être aidé par la diviser en deux UPDATEs:

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

et

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

Et puis voir si le Sql peut être simplifiée.

Afin de mieux étudier la requête, veuillez isoler la sous-requête b et voir si la majeure partie du temps est en fait que SELECT (contrairement au temps de faire le UPDATE).

Veuillez fournir SHOW CREATE TABLE pour chaque table et EXPLAIN pour les deux UPDATE(s) et le caractère isolé de SELECT(s). Un certain nombre d'indices pourrait venir d'.

2021-11-17 20:30:29

Dans d'autres langues

Cette page est dans d'autres langues

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