在Repo.preload中排序

时间:2017-10-25 01:16:16

标签: elixir ecto

我想了解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

2 个答案:

答案 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;)

非常好