如何解决带有分组查询的 Scala 光滑连接表
我有两张桌子:
-
购物
class ShopTable(tag: Tag) 扩展 GenericTableShop,UUID {
def * = (id.?,name,address) <> (Shop.tupled,Shop.unapply _) def name = column[String]("name") def address = column[String]("address")
}
val shopTable = TableQuery[ShopDAO.ShopTable]
-
订购
class OrderTable(tag: Tag) extends GenericTableOrder,shopId,amount) <> (Order.tupled,Order.unapply _) def shopId = column[UUID]("shop_id") def amount = column[Double]("amount")
}
val orderTable = TableQuery[OrderDAO.OrderTable]
我可以获得商店的静态(订单数、订单金额总和):
def getStatisticForShops(shopIds: List[UUID]): Future[Seq(UUID,Int,Double)] = {
searchStatisticsByShopIds(shopIds).map(orderStatistics =>
shopIds.map(shopId => {
val o = orderStatistics.find(_._1 == shopId)
(
shopId,o.map(_._2).getorElse(0),o.map(_._3).getorElse(0.0)
)
})
)
}
def searchStatisticsByShopIds(shopIds: List[UUID]): Future[Seq(UUID,Double)] =
db.run(searchStatisticsByShopIdsCompiled(shopIds).result)
private val searchStatisticsByShopIdsCompiled = Compiled((shopIds: Rep[List[(UUID)]]) =>
orderTable.filter(_.shopId === shopIds.any)
.groupBy(_.shopId)
.map { case (shopId,row) =>
(shopId,row.length,row.map(_.amount).sum.get)
}
)
我需要按订单数对 shopTable 进行排序和过滤。
如何将分组的 orderTable 加入到 shopTable 中,缺失商店的值为零?
我想要一个这样的请求:
| id(shopId) | name | address | ordersCount | ordersAmount |
| id1 | name | address | 4 | 200.0 |
| id2 | name | address | 0 | 0.0 |
| id3 | name | address | 2 | 300.0 |
我使用 scala 2.12.6、slick 2.12:3.0.1、play-slick 3.0.1、slick-pg 0.16.3
P.S.我可能找到了解决方案
val shopsOrdersQuery: Query[(Rep[UUID],Rep[Int],Rep[Double]),(UUID,Double),Seq] = searchShopsOrdersCompiled.extract
// Query shops with orders for sorting and filtering
val allShopsOrdersQueryQuery = shopTable.joinLeft(shopsOrdersQuery).on(_.id === _._1)
.map(s => (s._1,s._2.map(_._2).getorElse(0),s._2.map(_._3).getorElse(0.0)))
private val searchShopsOrdersCompiled = Compiled(
orderTable.groupBy(_.shopId)
.map { case (shopId,row.map(_.amount).sum.get)
}
)
解决方法
是的,这个解决方案工作正常
val shopsOrdersQuery: Query[(Rep[UUID],Rep[Int],Rep[Double]),(UUID,Int,Double),Seq] = searchShopsOrdersCompiled.extract
// Query shops with orders for sorting and filtering
val allShopsOrdersQueryQuery = shopTable.joinLeft(shopsOrdersQuery).on(_.id === _._1)
.map(s => (s._1,s._2.map(_._2).getOrElse(0),s._2.map(_._3).getOrElse(0.0)))
private val searchShopsOrdersCompiled = Compiled(
orderTable.groupBy(_.shopId)
.map { case (shopId,row) =>
(shopId,row.length,row.map(_.amount).sum.get)
}
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。