Sql Yessod Esqueleto-如何使用内部分页来表示选择?
我正在做一个分页资源,这将需要一个内部select,我已经用sql术语设计了它。其结构如下:Sql Yessod Esqueleto-如何使用内部分页来表示选择?,sql,yesod,esqueleto,Sql,Yesod,Esqueleto,我正在做一个分页资源,这将需要一个内部select,我已经用sql术语设计了它。其结构如下: select * from ( select w.*, d.distance from `Work` w inner join AdrDistance d on d.nhood2 = w.nhood where d.nhood1 = 1 -- this will be a variable order by d.distance limit
select *
from (
select w.*, d.distance
from `Work` w
inner join AdrDistance d on d.nhood2 = w.nhood
where d.nhood1 = 1 -- this will be a variable
order by d.distance
limit 0, 10 -- this will be pagination
) w
inner join WImage wi on wi.`work` = w.id
我的实体定义:
Work
...
WImage
work WorkId
url Text
AdrNhood
city AdrCityId
name Text maxlen=100
lat Double
lng Double
-- This is a view with a computed column I used for ordering
AdrDistance
nhood1 AdrNhoodId
nhood2 AdrNhoodId
distance Distance -- type Distance = Int - in Meters
我如何在Esqueleto
中定义这样一个类似于这种结构的select(当然是通过执行一个查询)?
更新
我试着走这条路:
worksByNhood nId offset' limit' =
from $ \wi -> do
(w, d) <- from $ \(w `InnerJoin` d) -> do
on $ d ^. AdrDistanceNhood2 ==. w ^. WorkNhood
where_ (d ^. AdrDistanceNhood1 ==. val nId)
orderBy [asc (d ^. AdrDistanceDistance)]
offset offset'
limit limit'
return (w, d)
where_ (wi ^. WImageWork ==. w ^. WorkId)
return (w, d ^. AdrDistanceDistance, wi)
worksByNhood nId偏移量“限制”=
从$\wi->do
(w,d)做什么
关于d^。ADRDancenHood2==。w^。工作状态
式中(d^.adrdancenhood1==.val nId)
订货人[asc(d^.ADRDanceDistance)]
偏移量
极限'
返回(w,d)
其中wi(wi^.WImageWork==.w^.WorkId)
返回值(w,d^.ADR距离,wi)
但这并没有促使我找到正确的解决方案。如果有人能帮助我(甚至说我最好做几个选择,因为我尝试的东西在Esqueleto
中不可行),请评论或回答我的问题。我已经阅读并得出结论Esqueleto
不是为了支持中的选择而设计的,因此,我采取了不同的做法:
worksByNhood nId offset' limit' = do
works <- select $ from $ \(w `InnerJoin` d) -> do
on $ d ^. AdrDistanceNhood2 ==. w ^. WorkNhood
where_ (d ^. AdrDistanceNhood1 ==. val nId)
orderBy [asc (d ^. AdrDistanceDistance)]
offset offset'
limit limit'
return (w, d ^. AdrDistanceDistance)
works' <- forM works $ \(w@(Entity wId _), d) -> do
images <- select $ from $ \wi -> do
where_ (wi ^. WImageWork ==. val wId)
return wi
return (w, d, images);
return works'
worksByNhood nId偏移量“限制”=do
工作做
关于d^。ADRDancenHood2==。w^。工作状态
式中(d^.adrdancenhood1==.val nId)
订货人[asc(d^.ADRDanceDistance)]
偏移量
极限'
返回(w,d^.AdrDistanceDistance)
工作做什么
图像可以
其中wi(WImageWork==.val-wId)
返回wi
返回(w、d、图像);
返回工作'
这并不完全是我想要的,但现在我将使用它。如果有人有更好的方法,请告诉我。我更新了问题,我之前确实输入了错误的实体定义。