Slick 3.0.0聚合查询

时间:2015-05-21 13:37:57

标签: scala slick

我试图在两张桌子上进行复杂的查询。它们如下所示:

表1:

  id:
  name:
  table2Id:
  version:

表2:

  id:
  comments:

假设我有适当的Slick类来表示这些表,我试图从表1和表2中获得满足以下条件的所有元素:

Table1.table2Id === Table2.id and max(Table1.version)

我尝试了以下内容:

val groupById = (for {
  elem1 <- table1Elems
  elem2 <- table2Elems if elem1.id === elem2.id
} yield (elem1, elem2)).groupBy(_._1.id)

我知道我必须映射groupById并查找最大版本,但我没有正确的语法!有什么帮助吗?

我需要的是Slick等效的以下SQL查询:

SELECT * 
FROM t t1 
WHERE t1.rev = (SELECT MAX(rev) FROM t t2 WHERE t2.id = t1.id)

1 个答案:

答案 0 :(得分:1)

模拟:

SELECT * from t t1 WHERE t1.rev = (SELECT max(rev) FROM t t2 WHERE t2.id = t1.id)

请尝试以下任一方法:

val q1 = for{
  t < table1 if t.rev === (
    table2.filter(_.id === t.id).map(_.rev).max
  )
} yield t

val q2 = table1.filter{t=> t.rev === (
  table2.filter(_.id === t.id).map(_.rev).max
)}.map(identity)

根据评论编辑:

val q = (for{
  t1 < table1; t2 <- table2 if t1.id === t2.id
} yield t1).orderBy(_.version.max).reverse.take(1)