首页 文章

Slick 3.0.0聚合查询

提问于
浏览
1

我正在尝试对两个表进行复杂的查询 . 它们如下所示:

表格1:

id:
  name:
  table2Id:
  version:

表2:

id:
  comments:

假设我有适当的Slick类来表示这些表,我试图从Table1和表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 回答

  • 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)
    

    EDIT based on comment:

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

相关问题