我如何可以使用集团职能的空间连接,以更新表在MySQL?

0

的问题

我正在尝试更新的总收入为办事处位于不同的地域。 该地区的定义界和多边这两者都是在形状。形状列。

当我运行查询下,MySQL引发"R_INVALID_GROUP_FUNC_USE:无效的使用组的功能"

我尝试适应 这个 答案,但我不能找出的逻辑,与有条件的加入和地理空间数据--它不是简单的添加一个子查询与其中的条款。 (或者是什么?)

对于背景下,我有约350个地理区域和150000办事处。

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

最好的答案

0

我认为,速度可以帮助分裂成两个 UPDATEs:

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

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

然后看看是否得到Sql可以简化。

为了进一步调查的查询,请隔离子查询 b 看看如果大部分时间是在做 SELECT (作为反对的时间做的 UPDATE).

请提供 SHOW CREATE TABLE 每个表并 EXPLAIN 对于这两个 UPDATE(s) 和隔离 SELECT(s). 一些线索可能来自这样的。

2021-11-17 20:30:29

其他语言

此页面有其他语言版本

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