如何使用过滤器和 groupBy 在 Scala 和 Quill 中表达此 SQL 查询?

伊斯瓦拉
SELECT
    posts.id, posts.title, COUNT(clicks.id)
FROM
    posts LEFT OUTER JOIN clicks ON posts.id = clicks.post_id
WHERE
    posts.author_id = '269286af-3be5-4dad-8b17-96704742b9a5'
    AND posts.timestamp > current_timestamp - '2 week'::interval
GROUP BY
    posts.id

我试过这个:

for {
    post <- Posts
        .leftJoin(Clicks).on((p, c) => p.id == c.postId)
        .map { case (post, _) => post }
        .filter(p => p.authorId == lift(userId) && p.isDeleted == lift(false))
    clickCount <- Clicks
        .groupBy(_.postId)
        .map { case (_, clicks) => clicks.size }
} yield ClickCount(post.id, post.title, clickCount)

但这在编译时给了我这个错误:

exception during macro expansion: 
java.lang.IllegalStateException: The monad composition can't be expressed using applicative joins. Faulty expression: 'p.id'. Free variables: 'List(p)'., Faulty expression: 'p.title'. Free variables: 'List(p)'.

更新

Michal Pawlicki 在他的回答中提供了缺失的部分。基于此,我得到了这个,它按预期工作:

for {
    post <- Posts
    clickCount <- Clicks
        .leftJoin(_.postId == post.id)
        .filter(_ => post.authorId == lift(userId) && !post.isDeleted)
        .groupBy(_ => post.id)
        .map {
            case (_, rows) =>
                ClickCount(
                    post.id,
                    post.title,
                    rows.map { maybeClick =>
                        maybeClick.map(_.id)
                    }.size
                )
        }
} yield clickCount
米哈尔·帕利基
val q = quote {
  Posts
    .leftJoin(Clicks).on((p, c) => p.id == c.postId)
    .filter { case (p, _) => p.authorId == lift(userId) && p.isDeleted == false }
    .groupBy { case (post, _) => (post.id, post.title) }
    .map { case ((postId, postTitle), rows) =>
      ClickCount(postId, postTitle, rows.map(_._2.map(_.id)).size)
    }
}

结果是:

SELECT p.id, p.title, COUNT(c.id)
FROM post p
LEFT JOIN click c ON p.id = c.post_id
WHERE p.author_id = ? AND p.is_deleted = false
GROUP BY p.id, p.title

完整示例:https : //scastie.scala-lang.org/IOEWWgZ6QM62TVe0H3e1Rw

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Java流过滤器和谓词美化以下Java查询?

使用scala slick重写此SQL查询

如何使用Scala Slick 3发送普通的SQL查询(和检索结果)

如何在scala中结合过滤器和地图?

过滤器和Scala Spark SQL中的位置之间的区别

在同一查询中使用join和groupBy的F#查询表达式

SQL查询以基于计数和一些过滤器查找MAX值

如何在groupby和aggregate函数为单个数字的SQL查询中返回行数?

Scala中的嵌套GroupBy和聚合

查询,索引和过滤器

如何使用过滤器从列表中查询?

如何使用过滤器选项查询API

如何在Django过滤器查询中使用大于和小于或等于

如何在Power Bi中使用默认过滤器和可用过滤器?

SQL查询在where和GroupBy之后查找唯一值

使用过滤器和选项在PHP MongoDB中查询文档的数组字段

在PostgreSQL中查询对月份和年份应用过滤器的数据集

在查询中使用fst和snd的Haskell过滤器

熊猫使用groupby和基于值的过滤器

如何使用WHERE过滤器中的数字列表编写此SQL查询

我如何在mongodb中表达此sql语句

编写SQL查询,使用过滤器将一列分为两列

Phantom vs Quill for Playframework(Scala)和Cassandra

使用where和groupby子选择SQL查询

Laravel:选择和 GroupBy SQL 查询错误。使用 groupBy 进行多项选择?是否可以?

Elasticsearch:使用过滤器和 constant_score 优化查询?

Groupby 和减去 Spark Scala

spark scala 数据框 groupBy 和 orderBy

使用 groupBy 和月将 sql 查询转换为 linq