1

这里已经有一个关于数组聚合的话题:

在 scala 框架中支持 PostgreSQL 特定的 array_agg 函数?

但是,由于它目前不受支持,我发现很难用 slick 做一些事情。这是一个简单的例子。

例如,我经营一家举办派对的企业。每个聚会都有客人,主人:

Party(id: Option[Int], name: String)
Guest(id: Option[Int], name: String)
Host(id: Option[Int], name: String)

PartyGuests(partyId, guestId: Int)
PartyHosts(partyId, hostId: Int)

我想要一张所有派对的桌子,显示所有客人和主人,如下所示:

PartyId |客人 |主持人
------------|------------------------|------
1 |亚当、朱莉、杰克 |汤姆、杰米、约翰
2 |乔、吉姆、杰克 |汤姆、托尼、詹姆斯
3 |艾米,莎莉 |珍妮

我的解决方案是这样的:

// The map is: partyId -> (guestNamesList, hostNamesList)
val partyTable: Map[Int, (List[String], List[String])] = (for {
  party <- db.run(parties.result.list)
  guest <- db.run(partyGuests
    .filter(_.partyId === party.id)
    .flatMap(_.guest)
    .result.list)
  host <- db.run(partyHosts
    .filter(_.partyId === party.id)
    .flatMap(_.host)
    .result.list)
} yield (party, guest, host))
  .groupBy { case (party, guest, host) =>
    party.id
  }
  .mapValues { values =>
    val myGuests = values.map(_._2).distinct.map(_.name)
    val myHosts = values.map(_._3).distinct.map(_.name)
    (myGuests, myHosts)
  }

然而,这种解决方案在大型数据集上非常占用空间。有谁知道更好的解决方案?

4

0 回答 0