使用以下查询模板选择全部:
val q = for {
a <- Parameters[Int]
b <- Parameters[Int]
t <- T if t.a == a && t.b == b
_ <- Query.orderBy(t.c, t.d)
} yield t
我需要修改它以选择第一个(此c
的最小d
和c
)或最后一个(最大c
和{ {1}}匹配d
条件的记录的最大值{1}}。{1}}我通常非常希望不会选择其他(最后/第一个)记录,因为有数十万个记录......
答案 0 :(得分:3)
在Invoker特征上定义了方法firstOption
,并且通过一些魔术可以在Query类中使用它。所以也许你可以这样试试:
val q = for {
a <- Parameters[Int]
b <- Parameters[Int]
t <- T if t.a == a && t.b == b
_ <- Query.orderBy(t.c, t.d)
} yield t
q.firstOption
答案 1 :(得分:3)
此处OP查询的构建方式存在潜在的危险。按原样运行,获取100K结果集的第一个或最后一个结果并不是非常有效(不太可能,是的,但重点是,查询对返回的行数没有限制)
使用直接SQL,你永远不会做这样的事情;相反,你会使用LIMIT 1
在ScalaQuery中,LIMIT = take(n),因此添加take(1)
以获取从查询本身返回的单个记录
val q = (for {
a <- Parameters[Int]
b <- Parameters[Int]
t <- T if t.a == a && t.b == b
_ <- Query.orderBy(t.c, t.d)
} yield t) take(1)
q.firstOption