【发布时间】:2014-07-08 04:53:42
【问题描述】:
我的数据类型定义为:
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,我可以很容易地创建一个查询来填充委员会视图。它会是这样的:
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 的问题。原则上,我们通过在上述查询中运行子查询来获得足够的数据来填充。好吧,够公平的。现在我如何在 SQL 中使用像 group by 这样的“按 Haskell-list 分组”?如何折叠行以便最终得到人员列表?
我的印象是esqueleto 无法处理这种情况(即,它没有可以做到这一点的组合器)。而且我的底层数据库显然不支持将 Haskell 列表作为列。但是,当然,我不能是唯一一个面对这个问题的人。什么是有效的策略?将列表的n列表折叠成n列表?或者运行n+1 查询?还有其他选择吗?
【问题讨论】:
-
你看过
Data.List.groupBy吗? -
@cdk:是的,这就是我一直在做的。不过,它会令人惊讶地多毛。
标签: sql list haskell esqueleto