小编Fat*_*kin的帖子

寻找最近点 - 优化

下面的SQL查询几乎是项目中最常用的部分。它的工作原理完全符合我的要求,但是它的成本(cost=11835.77..11835.82 rows=21 width=137)太高并且消耗服务器资源。

SELECT
  "companies"."id",
  "companies"."name",
  MIN(
    ST_Distance(
      addresses.location,
      ST_SetSRID(ST_Point(28.9856799, 41.0842721), 4326)
    )
  ) as distance
from
  "companies"
  left join "branches" on "companies"."id" = "branches"."company_id"
  and "branches"."active" = true
  inner join "addresses" on "branches"."id" = "addresses"."addressable_id"
  and "addresses"."addressable_type" = 'App\Domains\Company\Models\Branch'
where
  "available" = true
group by
  "companies"."id"
order by
  "distance" asc
limit
  21 offset 0;
Run Code Online (Sandbox Code Playgroud)

如果我必须简要解释一下;每个公司都有很多分支机构。我将分支的位置保留在addresses表中。我的目标是通过分页列出距离发送点最近的公司。

以下查询的成本(cost=0.57..23.12 rows=21 width=137)非常低,但是拥有多个分支机构的公司会出现重复。但该公司必须列为单一公司。

select
  "companies"."id",
  "companies"."name"
from
  "companies"
  left join "branches" on "branches"."company_id" = "companies"."id"
  left join "addresses" …
Run Code Online (Sandbox Code Playgroud)

sql postgresql location postgis

5
推荐指数
1
解决办法
132
查看次数

标签 统计

location ×1

postgis ×1

postgresql ×1

sql ×1