[英]How to select records with associated IDs but exclude them on the result?
[英]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
通常被保存多少次-我认为这是将Places
与SavedPlaces
合并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.