我有两个表:productsbaskets,它们有M2M关系,表名是basket_products.我试图得到具体的篮子相关的products个总数和price个数量,但我再次陷入困境.如何修复以下代码以获得结果?注意:我使用的是Ent框架

   err = client.Basket.
        Query().
        Where(basket.ID(2)).
        WithProducts().
        QueryProducts().
        GroupBy("price").
        Aggregate(func(selector *sql.Selector) string {
            return sql.As(sql.Sum("price"), "price")
        }).Scan(ctx, &r)
    if err != nil {
        log.Println(err)
    }
    log.Println(r)

推荐答案

AggregateGroupBy功能是朋友.Aggregation | Ent

感谢Ent团队,我修改了下面给出的代码,得到了一个非常优化的SQL查询.

err := client.Basket.
        Query().
        Where(basketEntity.ID(ID)).
        GroupBy(basketEntity.FieldID).
        Aggregate(func(s *sql.Selector) string {
            t := sql.Table(product.Table)
            joinT := sql.Table(basketEntity.ProductsTable)
            s.Join(joinT).
                On(s.C(basketEntity.FieldID), joinT.C(basketEntity.ProductsPrimaryKey[0]))
            s.Join(t).
                On(t.C(product.FieldID), joinT.C(basketEntity.ProductsPrimaryKey[1]))
            return sql.As(sql.Sum(t.C(product.FieldPrice)), "price")
        }).
        Aggregate(repository.Count()).
        Scan(ctx, &report)

生成的SQL个:

SELECT "baskets"."id", SUM("t2"."price") AS "price", COUNT(*) 
FROM "baskets" 
JOIN "basket_products" AS "t1" ON "baskets"."id" = "t1"."basket_id" 
JOIN "products" AS "t2" ON "t2"."id" = "t1"."product_id" 
WHERE "baskets"."id" = $1 
GROUP BY "baskets"."id" args=[1]

Go相关问答推荐

在字符串与字符串子切片上使用len进行位转移产生意外输出

Go GORM创建表,但不创建列

难以为多个平台添加Go Bazel构建选项

[0]Func()as";请勿比较哨兵类型

如何给杜松子wine 的路由加上一个名字,比如Laravel ?

我找不到pcap.Openlive的设备名称

如何用';贪婪原则';正确地

无法使用exec从管道中读取.Go中的命令

以编程方式取消 pyspark dataproc 批处理作业(job)

尽管存在 WaitGroup,Goroutines 似乎被打断了

获取 nil 指针类型的 reflect.Value

将文本文件放入切片然后进行比较

没有任务角色的 AWS CDK ECS 任务定义

整理时转换值

如何仅提取时间作为持续时间

分配空切片而不引用其类型?

Golang:每个键具有多个值的映射

Go 错误:Is() 和 As() 声称是递归的,是否有任何类型实现错误接口并支持这种递归 - 无错误?

Go generics:我会在哪里使用 any 而不是 interface{}?

Golang 将类型 [N]byte 转换为 []byte