【问题标题】:Slick 3.0.0 Aggregate QueriesSlick 3.0.0 聚合查询
【发布时间】:2015-05-21 13:37:57
【问题描述】:

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

表1:

  id:
  name:
  table2Id:
  version:

表2:

  id:
  comments:

假设我有代表这些表的适当 Slick 类,我试图从 Table1 和 Table 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 并查找最大版本,但我的语法不正确!有什么帮助吗?

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

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

【问题讨论】:

    标签: scala slick


    【解决方案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)
    

    【讨论】:

    • table2中没有revision字段,所以map(_.rev)不起作用?可能是我的问题可能是错误的。对不起!如果您注意到 Table 结构,则版本存在于 Table1 中而不是 Table2 中。所以我想要有效的是 Table1 中给定 id 的最大版本,在 Table2 中匹配
    • 我修改了我的另一篇文章,这与我正在尝试做的事情略有不同。 stackoverflow.com/questions/30407289/…你能看一下建议吗?
    • 您的两个查询都不起作用。你有更好的主意吗?有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多