首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Esqueleto的独特的邮政作家

Esqueleto的独特的邮政作家
EN

Stack Overflow用户
提问于 2015-12-06 19:01:40
回答 1查看 155关注 0票数 2

我有一个Esqueleto查询,它选择了所有的StatusUpdate和它们各自的User,我想把它限制为每个User只有一个StatusUpdate,而现在只限于StatusUpdate

我有一个有效的SQL查询,我只是在努力将其转换为有效的Esqueleto。

代码语言:javascript
复制
SELECT "email", "subject"
FROM "status_update"
LEFT JOIN "user"
ON ("status_update"."user" = "user"."id")
WHERE "status_update"."id"
IN (SELECT MAX("status_update"."id") FROM "status_update" GROUP BY "status_update"."user")

到目前为止我所拥有的是:

代码语言:javascript
复制
  statusUpdates <- runDB
    $ E.select
    $ E.from $ \(status_update `E.LeftOuterJoin` user) -> do

      E.on (status_update ^. StatusUpdateUser E.==. user ^. UserId)

      E.where_ ((status_update ^. StatusUpdateId) `E.in_`
        (E.subList_select $ E.from $ \(status_update) -> do
          E.groupBy (status_update ^. StatusUpdateUser)
          return (status_update ^. StatusUpdateId)))

      return
        ( status_update ^. StatusUpdateId
        , status_update ^. StatusUpdateSubject
        , status_update ^. StatusUpdateMessage
        , user ^. UserEmail
        )

…它产生以下输出:

代码语言:javascript
复制
SELECT "status_update"."id", "status_update"."subject", "status_update"."message", "user"."email"
FROM "status_update"
LEFT OUTER JOIN "user"
ON "status_update"."user" = "user"."id"
WHERE "status_update"."id"
IN (SELECT "status_update2"."id" FROM "status_update" AS "status_update2" GROUP BY "status_update2"."user"); []

在我的第二个选择中,似乎唯一缺少的是MAX函数。我一直试图将E.max_压缩到查询的不同部分,但我似乎无法让任何东西工作。

帮助?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-07 20:27:41

与使用subList_select和尝试调用max_不同,您只需使用sub_select并按日期和限制1对子查询排序。

这就是我找到的解决方案,它看起来很管用:

代码语言:javascript
复制
    result <- select $ from $ \(user, status_update) -> do
        let subquery = from $ \status_update2 -> do
            where_ (status_update2 ^. StatusUpdateUser ==. user ^. UserId)
            where_ (date (status_update2 ^. StatusUpdatePosted) ==. date now)
            orderBy [desc (status_update2 ^. StatusUpdatePosted)]
            limit 1
            return (status_update2 ^. StatusUpdateId)

        where_ (status_update ^. StatusUpdateId ==. sub_select subquery)
        where_ (user ^. UserId ==. status_update ^. StatusUpdateUser)
        return
            ( status_update ^. StatusUpdateId
            , status_update ^. StatusUpdateSubject
            , status_update ^. StatusUpdateMessage
            , user ^. UserEmail
            )

生成的SQL是:

代码语言:javascript
复制
SELECT "status_update"."id", "status_update"."subject", "status_update"."message", "user"."email"
FROM "user", "status_update"
WHERE ("status_update"."id" = (SELECT "status_update2"."id"
    FROM "status_update" AS "status_update2"
    WHERE ("status_update2"."user" = "user"."id")
    AND (date("status_update2"."posted") = date(date(?)))
    ORDER BY "status_update2"."posted" DESC
    LIMIT 1))
AND ("user"."id" = "status_update"."user")

为了满足“当前只有StatusUpdates”的条件,我通过导入Database.Esqueleto.Internal.Sql和:

代码语言:javascript
复制
date :: SqlExpr (Value UTCTime) -> SqlExpr (Value Int)
date d = unsafeSqlFunction "date" d

now :: SqlExpr (Value UTCTime)
now = unsafeSqlFunction "date" (val "now" :: SqlExpr (Value String))

然而,“从今天开始”对你来说意味着什么可能是不同的(过去的24小时,在某个时区,等等)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34121399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档