簡體   English   中英

在Esqueleto和Yesod中執行COUNT(id)的正確方法是什么

[英]What is a correct way of doing COUNT(id) in Esqueleto and Yesod

我試圖弄清楚如何使用Esqueleto編寫以下查詢

SELECT COUNT("person"."id")
FROM "person"
WHERE (("person"."admin" = 't' OR "person"."vip" = 't') // 't' as in True
      OR "person"."karma" >= 5000 AND "person"."hellbanned" = 'f')

這是我的模型的定義方式

Person
    admin Bool
    vip Bool
    karma Int
    hellbanned Bool

除了COUNT部分,我已經成功獲得了所有東西

select $
  from $ \p -> do
    where_
      ((p ^. PersonAdmin ==. val True) ||. (p ^. PersonVip ==. val True)
      &&. (p ^. PersonKarma >=. val 5000) &&. (p ^. PersonHellbanned ==. val False))
    return $ p ^. PersonId

我設法找到了一個countRows函數,但是我沒有設法找到一種方法來組合這兩個以countRows的方式。

我也不確定我是否需要所有那些p ^. 在where子句的每個分支中,或者如果那些可以以某種方式折疊在一起?

這里有一些我有的舊代碼,我不記得很多,但希望它有所幫助!

selectCount
  :: (From SqlQuery SqlExpr SqlBackend a)
  => (a -> SqlQuery ()) -> Persist Int
selectCount q = do
  res <- select $ from $ (\x -> q x >> return countRows)
  return $ fromMaybe 0 $ (\(Value a) -> a) <$> headMay res

getCount :: RepositoryUri -> Persist Int
getCount ruri =
  selectCount $ \(r `InnerJoin` rs) -> do
    on     $ r ^. R.RepositoryId  ==. rs ^. Repo
    where_ $ r ^. R.Uri ==. val ruri

我發現Adam Bergmark的答案非常有用,但我認為它應該提供更多信息:

import Import hiding ( Value )
import Data.Maybe ( maybeToList
                  , listToMaybe )
import Database.Esqueleto
import Database.Esqueleto.Internal.Language (From)

selectCount
  :: (From SqlQuery SqlExpr SqlBackend a)
  => (a -> SqlQuery ()) -> YesodDB App Int
selectCount q = do
  res <- select $ from $ (\x -> q x >> return countRows)
  return $ fromMaybe 0 . listToMaybe . fmap (\(Value v) -> v) $ res

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM