我将数据类型定义为:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
现在,就目前而言,我有一个持久模型定义为:
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中使用“按Haskell-list分组” ?如何折叠行,以便最终得到人员名单?
我得到的印象是esqueleto
无法处理这种情况(即,它没有可以做到的组合器)。而且我的基础数据库显然不支持Haskell列表作为列。但是,可以肯定的是,我不能成为面对这个问题的唯一人。什么是有效策略?将列表的n个列表折叠成n个列表?还是正在运行n+1
查询?还有其他选择吗?
@cdk:是的,这就是我一直在做的。但是,它变得出奇的毛茸茸。
—
nomen 2014年
Data.List.groupBy
吗?