如何使用ScalaQuery只选择一个符合where子句的第一个或最后一个记录?

时间:2012-04-16 04:26:12

标签: scala scalaquery

使用以下查询模板选择全部:

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的最小dc)或最后一个(最大c和{ {1}}匹配d条件的记录的最大值{1}}。{1}}我通常非常希望不会选择其他(最后/第一个)记录,因为有数十万个记录......

2 个答案:

答案 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