使用 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 ($)
);
还有很多其他的方式,但是这个应该是最快最清楚的了。
不过,从 geometry
到 geography
的演员阵容似乎令人担忧。你有表达式 index 覆盖那个吗?
相关:
这是我的查询:
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 ($)
);
还有很多其他的方式,但是这个应该是最快最清楚的了。
不过,从 geometry
到 geography
的演员阵容似乎令人担忧。你有表达式 index 覆盖那个吗?
相关: