我想了解Repo.preload
所做的查询,为什么会有order by
条款。
App.Repo.get(Sopitas.Continent, 1) |> App.Repo.preload(:countries)
执行的查询是:
[debug] QUERY OK source="continents" db=0.4ms
SELECT c0.`id`, c0.`name`, c0.`sm_id`, c0.`inserted_at`, c0.`updated_at`
FROM `continents` AS c0 WHERE (c0.`id` = ?) [1]
[debug] QUERY OK source="countries" db=3.5ms decode=1.1ms
SELECT c0.`id`, c0.`sm_id`, c0.`name`, c0.`continent_id`, c0.`inserted_at`, c0.`updated_at`, c0.`continent_id`
FROM `countries` AS c0 WHERE (c0.`continent_id` = ?)
ORDER BY c0.`continent_id` [1]
我想理解这部分是因为据我所知,order by
子句为执行查询添加了处理时间。我宁愿避免使用order by
。
答案 0 :(得分:1)
这不是因为Repo.preload
,而是因为此preload
查询返回了许多记录。
ORDER BY
子句是added by Ecto
,用于在获取大量记录之前有效地对国家/地区(数据库引擎内)进行分组。
我提供的链接显示了一种通用的Ecto
方法:一旦查询返回许多记录,就会按密钥对它们进行排序。
答案 1 :(得分:1)
在构建查询片段时,也可以使用带有预加载的SQL子句函数。例如:
alias App.Repo
Sopitas.Continent
|> Repo.get(1)
|> Repo.preload([countries: (from c in Country, order_by: c.<your_field_goes_here>)])
学习官方docs;)
非常好