如何在PotgreSQL中选择所有相关记录ID的数组?

时间:2016-07-26 11:59:15

标签: sql postgresql

我有以下关系:

Place(1) |----< (N)SavedPlace(N) >----| (1)Visitor

所以:

  • 许多Place
  • 可以保存一个Visitors
  • 一个SavedPlace只保存一个Place
  • 一个SavedPlace完全由一个Visitor
  • 保存
  • 一个Visitor可以节省许多Places

我想:

  • 计算一般Place被保存的次数 - 我想这是将Places加入SavedPlaces,按Place ID对其进行分组并计算SavedPlacesVisitor每个组都有1个} ID
  • 查看Place是否保存了Visitors - 我想这可能是每个地方都有from place in query, left_join: saved_places in assoc(place, :saved_places), group_by: place.id, select: %{place | saved_count: count(saved_places.id)} 个ID列表。

我做的第一个:

Places

对于第二个,我不知道。

SQL应该如何查询这两个值?

编辑:

我意识到我没有正确描述第二个用例。我想查询所有Visitor,并告诉他们每个人是否由特定netcoreapp1.0保存(当然知道他的ID)。

2 个答案:

答案 0 :(得分:1)

您要查找两个查询:

  

计算一个地方一般保存了多少次 - 我想这是加入与SavedPlaces的地方,按地点ID对它们进行分组,并计算每组的SavedPlaces ID数量

select     places.place_id, places.place_name, Count(*)
from       places
inner join savedplaces on savedplaces.place_id = places.place_id
group by   places.place_id, places.place_name

如果访问者可以将地点保存两次(在您的应用程序中有意义吗?),您只想计算一次这样的重复项,那么请替换Count(*)Count(distinct savedplaces.visitor_id)

对于其他请求:

  

查看访客是否保存了地点 - 我想这可能是每个地方都有访客ID列表。

select     places.place_id, places.place_name, visitors.visitor_id, visitors.visitor_name
from       places
inner join savedplaces on savedplaces.place_id = places.place_id
inner join visitors on visitors.visitor_id = savedplaces.visitor_id 

要了解保存特定地点的访问者,请添加where子句:

where      places.place_id = ?

...其中?表示您想要访问者的任何place_id。

同样,要了解特定访问者保存的位置,请使用where子句:

where      places.visitor_id = ?

...其中?表示您想要获取保存位置的任何visitor_id。

如果您想要列出所有地点,并指示特定访问者是否保存了它(是/否),那么您可以使用外部(left)联接:

select     places.place_id, places.place_name, 
           case when savedplaces.visitor_id is null then 'No' else 'Yes' end
from       places
left join  savedplaces on savedplaces.place_id = places.place_id
       on  savedplaces.visitor_id = ?

同样,如果您想要列出所有访问者,并指示他们是否保存了特定地点(是/否),那么您也可以使用外部(left)联接:

select     visitors.visitor_id, visitors.visitor_name, 
           case when savedplaces.place_id is null then 'No' else 'Yes' end
from       visitors
left join  savedplaces on savedplaces.visitor_id = visitors.visitor_id
       on  savedplaces.place_id = ?

答案 1 :(得分:1)

您可以按如下方式编写查询

1)

SELECT p1.name, x.placeCount
FROM Place p1 INNER JOIN
(SELECT p2.id, COUNT(s.placeId) as placeCount
FROM Place p2 
INNER JOIN SavedPlace s
ON p2.id = s.placeId
GROUP BY p2.id ) x
ON p1.id = x.id

2)

SELECT v.name
FROM SavedPlace s
INNER JOIN Visitor v
ON s.vistorId = v.id
WHERE s.placeId = <your_place_id>