Scala Slick 3.0 中的随机行
Random row in Scala Slick 3.0
如何有效地从 table 中随机取出一行?
到目前为止我所拥有的(没有编译并且可能完全被误导了):
val query = for {
m <- tableQuery
maxId <- tableQuery.groupBy(_.id).map { case (tId, t) => t.map(_.id).max}//m.map(_.id).max
if (m.id >= maxId * Random.nextFloat())
} yield m
编辑: 经过一些修改并在 bhavya 的帮助下,我想出了以下代码,它完成了工作,但进行了两次数据库往返:
val maxIdQuery: Rep[Option[Int]] = magicCardDumps.map(_.id).max
val maxIdFuture: Future[Option[Int]] = db.run(maxIdQuery.result)
val maxId = Await.result(maxIdFuture, 10 seconds).get
val randCardQuery: Query[MagicCardDumps, MagicCardDump, Seq] = magicCardDumps.filter(_.id >= (maxId * Random.nextFloat()).toInt).sortBy(_.id).take(1)
val resultFuture: Future[Seq[MagicCardDump]] = db.run(randCardQuery.result)
val resultSeq: Seq[MagicCardDump]= Await.result(resultFuture, Duration(10, "seconds"))
val card = resultSeq.head
println(card)
如何将这些查询合并为一个并提高效率?
希望这对您有所帮助:
val rowElementAsOpt = for {
maxId <- Query(tableQuery.map(_.id).max).first
result <- tableQuery.filter(_.id >= maxId*Random.nextFloat).firstOption // fetches the first element of the resultset as an Option
} yield result
rowElementAsOpt match{
case Some(rowElement) => // A random row
case None => // No row
最好的方法是使用 SimpleFuction
val rand = SimpleFunction.nullary[Double]("rand")
query.sortBy(x => rand).take(1)
在 Postgres 和 MySQL
中工作
如何有效地从 table 中随机取出一行?
到目前为止我所拥有的(没有编译并且可能完全被误导了):
val query = for {
m <- tableQuery
maxId <- tableQuery.groupBy(_.id).map { case (tId, t) => t.map(_.id).max}//m.map(_.id).max
if (m.id >= maxId * Random.nextFloat())
} yield m
编辑: 经过一些修改并在 bhavya 的帮助下,我想出了以下代码,它完成了工作,但进行了两次数据库往返:
val maxIdQuery: Rep[Option[Int]] = magicCardDumps.map(_.id).max
val maxIdFuture: Future[Option[Int]] = db.run(maxIdQuery.result)
val maxId = Await.result(maxIdFuture, 10 seconds).get
val randCardQuery: Query[MagicCardDumps, MagicCardDump, Seq] = magicCardDumps.filter(_.id >= (maxId * Random.nextFloat()).toInt).sortBy(_.id).take(1)
val resultFuture: Future[Seq[MagicCardDump]] = db.run(randCardQuery.result)
val resultSeq: Seq[MagicCardDump]= Await.result(resultFuture, Duration(10, "seconds"))
val card = resultSeq.head
println(card)
如何将这些查询合并为一个并提高效率?
希望这对您有所帮助:
val rowElementAsOpt = for {
maxId <- Query(tableQuery.map(_.id).max).first
result <- tableQuery.filter(_.id >= maxId*Random.nextFloat).firstOption // fetches the first element of the resultset as an Option
} yield result
rowElementAsOpt match{
case Some(rowElement) => // A random row
case None => // No row
最好的方法是使用 SimpleFuction
val rand = SimpleFunction.nullary[Double]("rand")
query.sortBy(x => rand).take(1)
在 Postgres 和 MySQL
中工作