Nasıl bir mekan üzerinde MySQL tablosunu güncelleştirmek için bu gruba KATIL fonksiyonları kullanabilir miyim?

0

Soru

Farklı coğrafyalarda bulunan ofislerin toplam gelirini güncellemeye çalışıyorum. Coğrafyalar, her ikisi de şekillerde olan daireler ve çokgenler tarafından tanımlanır.şekil sütunu.

Aşağıdaki sorguyu çalıştırdığımda MySQL "R_INVALID_GROUP_FUNC_USE: Grup işlevinin geçersiz kullanımı"atar.

Bu cevabı uyarlamaya çalıştım, ancak koşullu birleştirme ve jeo uzamsal verilerle mantığı anlayamıyorum-WHERE yan tümcesiyle bir alt sorgu eklemek kadar basit değil. (Yoksa değil mi?)

Bağlam için yaklaşık 350 coğrafyam ve 150.000 ofisim var.

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

Güncelleme:

Bu işe yarıyor, ama yavaş ve kafa karıştırıcı. Daha hızlı / daha özlü bir yol var mı?

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

En iyi cevabı

0

Bence bu hız ikiye bölünerek yardımcı olabilir UPDATEs:

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

ve

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

Ve sonra ortaya çıkan sql'lerin basitleştirilip basitleştirilemeyeceğine bakın.

Sorguyu daha fazla araştırmak için lütfen alt sorguyu yalıtın b ve zamanın büyük bir kısmının bunu yapıp yapmadığına bakın SELECT (zamanın aksine UPDATE).

Lütfen sağlayın SHOW CREATE TABLE her tablo için ve EXPLAIN hem UPDATE(s) ve izole SELECT(s). Bunun gibi bir takım ipuçları gelebilir.

2021-11-17 20:30:29

Diğer dillerde

Bu sayfa diğer dillerde

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