繁体   English   中英

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

[英]How to SELECT an array of all associated records IDs in PotgreSQL?

我有以下关系:

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

所以:

  • 一个Place可以被许多Visitors保存
  • 一个SavedPlace省只有一个Place
  • 一个SavedPlace完全由一位Visitor保存
  • 一位Visitor可以保存很多Places

我想要:

  • 计算一个Place通常被保存多少次-我认为这是将PlacesSavedPlaces合并SavedPlaces ,按Place ID分组,然后计算每个组有多少个SavedPlaces ID
  • 查看Visitor保存了Place -我想这是每个地点都有一个Visitors ID列表。

我做的第一个:

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

对于第二个,我不知道。

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


编辑:

我意识到我没有正确描述第二个用例。 我想查询所有Places并为每个Places询问它们是否由特定Visitor保存(当然知道他的ID)。

您寻找两个查询:

计算一个地方通常被保存了多少次-我认为这是将地方与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)

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM