我有三个模型
Vendor
,
VendorModel
Camera
. 我做这个查询是为了
VendorModels
.
query = from vm in VendorModel,
join: v in Vendor, on: vm.vendor_id == v.id,
where: like(fragment("lower(?)", vm.name), ^("%#{search}%")),
where: like(fragment("lower(?)", v.name), ^("%#{search}%"))
models = query |> add_sorting(column, order) |> preload(:vendor) |> Evercam.Repo.all()
我在追加
order_by
通过方法add_sorting只将
订货人
例如
defp add_sorting(query, "exid", order) do
from [vm, _v] in query,
order_by: [{^sort_order(order), vm.exid}]
end
在得到所有我正在做的模型之后
Enum.reduce
格式化所有模型上的对象。在每个
供应商模型
与
,我将得到相机中引用的每个模型的计数,例如
Enum.reduce(display_start..index_end, [], fn i, acc ->
model = Enum.at(models, i)
vm = %{
vendor_exid: model.vendor.exid,
exid: model.exid,
camera_count: Camera |> where(model_id: ^model.id) |> Evercam.Repo.all() |> Enum.count(),
}
acc ++ [vm]
end)
这总是为每个模型运行另一个查询来获取摄像机的计数,是否有可能将此计数查询添加到第一个查询的上方。它还支持order by?
我已经读过subquery和group_by,但是我做不到
谢谢你的帮助。
更新:
PostgreSQL
SELECT vendor_models.id, vendor_models.name, v.name, count(cameras.id) as count
FROM vendor_models
INNER JOIN vendors as v ON vendor_models.vendor_id = v.id
INNER JOIN cameras ON vendor_models.id = cameras.model_id
WHERE lower(vendor_models.name) like lower('%ax%') OR lower(v.name) like lower('%ax%')
GROUP BY vendor_models.id, vendor_models.name, v.name
ORDER BY v.name asc
但我不知道怎么会在体外。
更新:
最终查询如下
SELECT vm.*, v.name as vname, count(cameras.id) as count
FROM vendor_models as vm
INNER JOIN vendors as v ON vm.vendor_id = v.id
INNER JOIN cameras ON vm.id = cameras.model_id
WHERE lower(vm.name) like lower('%ax%') OR lower(v.name) like lower('%ax%')
GROUP BY vm.id, v.name
ORDER BY v.name asc
你能帮我把它转换成外阴吗?