2015-11-04 78 views
1

我應該從3個表中選擇數據從每個查詢 結果,我將與插圖操作使用油滑3連接查詢

val q1 = tQ.filter(...).groupBy(_.s).map(_._1) 
val r1 = Await.result(db.run(q1.result), Duration.Inf) 

val q2 = tQ.filter(...inSet(r1)).groupBy(_.s).map(_._1) 
val r2 = Await.result(db.run(q2.result), Duration.Inf) 

val q3 = tQ.filter(...inSet(r2)).groupBy(_.s).map(_._1) 
val r3 = Await.result(db.run(q3.result), Duration.Inf) 

我可以加入2個個小查詢到嗎?

謝謝!

回答

2

有趣的查詢是高度可組合的。像這樣的東西應該做的:

val q = for { 
    r1 <- tQ.filter(...).groupBy(_.s).map(_._1).result 
    r2 <- tQ.filter(...inSet(r1)).groupBy(_.s).map(_._1).result 
    r3 <- tQ.filter(...inSet(r2)).groupBy(_.s).map(_._1).result 
} yield r3 

Await.result(db.run(q), Duration.Inf) 

如果X是某種類型的,你想傳遞給inSet,那麼你.filter(...).groupBy(...).map(_._1)類型爲Query[Xs, X, Seq]。調用.result給出DBIO[Seq[Xs]]。由於您在for的理解區塊和所有理解都有DBIO類型,您的rN結果實際上是Seq[X]因此您可以將它們傳遞給inSet方法。

查閱關於monadic joins的文檔。

您可能還想考慮使用inSetBind

+0

太棒了。謝謝! – scalaz

+0

介意接受這個答案? –