miyazi888の覚え書き日記

学習したことを書き留めてます。

entでgroup byで集約した結果のcountでorder byする方法

タイトルどおり。

select count(*) as cnt from items group by type order by cnt desc

みたいにgroup byして指定した項目毎に件数で並び替えたい、というケースがある場合、entではどうやったら記述できるのか調べた。

本当にこれが正解なのかはわからなかったけど、一応上のようなクエリをentで発行することはできた。

var results []struct {
  Count  int
  Type   string
}
err = r.ent().Item.Query().Where(apply).Order(
        func(s *sql.Selector) {
            s.OrderExpr(sql.ExprP("Count(*) Desc"))
        },
    ).GroupBy(item.FieldType).Aggregate(ent.Count()).Scan(ctx, &results)

でも、もっといいやり方がありそうで、少しモヤル。

追記: 特に試してはいないけど、entでコード生成した時にすでに上記のようなものが生成されている模様。 だから、自前で上記のようなコードは記述する必要はなさそう。

参考

entgo.io