使用 IN 筛选时如何获取所有相关行?

How can I get all the related rows when using IN to filter?

这是我的查询:

select "spaces"."id" as "id",
  "spaces"."user_id" as "user_id",
  "spaces"."type" as "type",
  "spaces"."latitude" as "latitude",
  "spaces"."longitude" as "longitude",
  "categories"."category_id" as "categories:category_id"
  from "spaces"
  left join "spaces_categories" as "categories" on "categories"."space_id" = "spaces"."id"
  where "categories"."category_id" in ($)
  and ST_DWithin(spaces.geometry::geography, ST_SetSRID(ST_Point($,$), 4326)::geography, $)

我正在使用 pg 14.1

我正在尝试查找半径内满足请求的类别 ID 的所有 space,以及这些 space 的所有类别。

一个 space 可以有很多类别 ID,所以如果我搜索类别 ID (1,2),并且恰好有 2 space 个结果(假设每个 space 有 4 个类别,1,2,3,4),我希望有 8 行。但是,我的查询只有 returns 4 行,类别 1,2.

我如何更新我的查询以便我可以获得所有类别,只要有一些重叠?

是因为我的IN条款吗?

EXISTS 子查询应该可以解决问题:

SELECT s.id
     , s.user_id
     , s.type
     , s.latitude
     , s.longitude
     , c.category_id AS "categories:category_id"
FROM   spaces                 s
LEFT   JOIN spaces_categories c ON c.space_id = s.id
WHERE  st_dwithin(s.geometry::geography, st_setsrid(st_point($,$), 4326)::geography, $)
AND    EXISTS (
   SELECT FROM spaces_categories x
   WHERE  x.space_id = s.id
   AND    x.category_id IN ($)
   );

还有很多其他的方式,但是这个应该是最快最清楚的了。

不过,从 geometrygeography 的演员阵容似乎令人担忧。你有表达式 index 覆盖那个吗?

相关: