4

具有以下查询模板以选择全部:

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

我需要修改它以选择匹配条件的第一个(具有最小值cd最小值c)或最后一个(具有最大值cd最大值)的记录。我通常强烈不希望选择其他(除了最后/第一个)记录,因为它们有数十万条......cwhere

4

2 回答 2

3

Invoker trait 上定义了一个方法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
于 2012-04-16T04:52:55.090 回答
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
于 2012-04-16T12:24:55.873 回答