다음과 같이 정의 된 데이터 유형이 있습니다.
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
자, 그대로 Persistent 모델을 다음과 같이 정의했습니다.
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Esqueleto를 사용하여 CommitteeView를 채우는 쿼리를 쉽게 만들 수 있습니다. 다음과 같이 갈 것입니다.
getCommitteeView cid =
CommitteeView <$> runDB $
select $
from (person `InnerJoin` pxc `InnerJoin` committee) -> do
on (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
on (person ^. PersonId ==. pxc ^. CommitteePersonPersonId)
where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
return person
이제는 인구 문제를 고려하십시오 CommitteesView
. 원칙적으로 위 쿼리에서 하위 쿼리를 실행하여 채울 데이터가 충분합니다. 알았어, 충분 해 이제 group by
SQL 에서처럼 "group by Haskell-list"를 어떻게 사용할 수 있습니까? 사람들의 목록으로 끝나도록 행을 어떻게 접을 수 있습니까?
esqueleto
사례를 처리 할 수없는 인상을받습니다 (즉,이를 수행 할 결합기가 없습니다). 그리고 내 기본 데이터베이스는 분명히 Haskell 목록을 열로 지원하지 않습니다. 그러나 분명히이 문제에 직면 할 수있는 유일한 사람은 아닙니다. 효과적인 전략은 무엇입니까? n- 목록을 n- 목록으로 접기? 아니면 n+1
쿼리를 실행 합니까? 다른 옵션이 있습니까?
Data.List.groupBy
?