Elixir 存储要按顺序使用的计算列,然后选择
所以我在做一个PostGis计算。我有一个用户和一个地点模型。每个都有一个Elixir 存储要按顺序使用的计算列,然后选择,elixir,ecto,Elixir,Ecto,所以我在做一个PostGis计算。我有一个用户和一个地点模型。每个都有一个:geom,而Place有一个虚拟的距离字段。我要按距离订购,也要选择它。我让它像这样工作,但我担心它会做两次postgis计算。有更好的方法吗 from( ..., order_by: [asc: st_distance(u.geom, p.geom)], select: %{p | distance: st_distance(u.geom, p.geom)} ) 您可以使用别名重用该计算值,尽管您必须使
:geom
,而Place有一个虚拟的距离
字段。我要按距离订购,也要选择它。我让它像这样工作,但我担心它会做两次postgis计算。有更好的方法吗
from(
...,
order_by: [asc: st_distance(u.geom, p.geom)],
select: %{p | distance: st_distance(u.geom, p.geom)}
)
您可以使用别名重用该计算值,尽管您必须使用片段。这不是一种折衷!很好地描述了逻辑 在您的用例中,它将给出如下内容:
from(
...,
order_by: [asc: fragment("distance")],
select: %{p | distance: fragment("? AS distance", st_distance(u.geom, p.geom))}
)
你有证据证明它在计算两次吗?我假设Postgresql能够在select@m3characters我没有这方面的证据。我只是好奇是否有更好的方法。但你可能是对的,它看到计算已经完成了,只是使用了它。我只是问,因为你可以做一些测试,看到它需要更多的时间,这可能暗示它可能在做额外的工作?如果是这样的话,也许您可以为select字段使用一个片段并将其别名,然后使用一个片段引用与orderby相同的名称?