我有以下关系:
Place(1) |----< (N)SavedPlace(N) >----| (1)Visitor
所以:
Place
Visitors
SavedPlace
只保存一个Place
SavedPlace
完全由一个Visitor
Visitor
可以节省许多Places
我想:
Place
被保存的次数 - 我想这是将Places
加入SavedPlaces
,按Place
ID对其进行分组并计算SavedPlaces
个Visitor
每个组都有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)。
答案 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>