有没有一种方法可以遍历要在Ecto查询中选择的属性列表?

时间:2019-11-25 21:04:14

标签: sql elixir phoenix-framework ecto

因此,我有一个查询正在尝试构造一个列表attributes,该列表是表中的列。该查询将按属性列表进行分组,计数,并使用属性列表返回计数。最后一部分是我遇到的困难。现在我有

defmodule ProjectName.Counter do
  import Ecto.Query, only: [group_by: 3, select: 3]

  def group_and_count(queryable, groups) do
    queryable
    |> group_by([q], ^groups)
    |> select([q], count(q.id))
  end
end

我在上下文中这样调用

Track
|> Counter.group_and_count([:album, :artist])
|> Repo.all()

哪一个返回我[1, 5, 4, 2]是正确的,而不是我希望它返回的内容。我想实际进行查询

SELECT COUNT(*), tracks.album, tracks.artist FROM tracks GROUP BY tracks.album, tracks.artist

将会返回

[[1, "Calypso", "Harry Belafonte"],
 [5, "Silk & Soul", "Nina Simone"],
 [4, "Hello, Dolly!", "Louis Armstrong"],
 [2, "Pure Gold", "Perry Como"]]

如何更改代码以使其正常工作?我找不到在groups查询中迭代select的方法。

1 个答案:

答案 0 :(得分:1)

也许有更好的方法,但是看起来map/2struct/2可以支持传入列表。

这很丑陋,但是您可以select一个包含地图和计数的元组:

|> select([q], {map(q, ^groups), count(q.id)})