首页 > 解决方案 > 选择子查询peewee

问题描述

我想知道我是否可以在 sub_query 上执行 select()。我可以使用任何 peewee.Model 加入 sub_query。但是当我写了一个 sub_query 并且我想只用其中一个列分组时

e.g. sub_query.select(sub_query.c.column_1, fn.COUNT(sub_query.c.column2)alias('col2_count')).group_by(sub_query.c.column_1)

查询未嵌套并给出 SQL 语法错误。

(不能透露代码)(我在 sub_query 上做了 alias())

编辑

例子:

class Product(Model):
    id = PrimaryKeyField()
    name = CharField()
    created_date = DateField()


class Part(Model):
    id = PrimaryKeyField()
    product = ForeignKeyField(Product)
    name = CharField()


class ProductError(Model):
    id = PrimaryKeyField()
    product = ForeignKeyField(Product)
    note = CharField()

class PartError(Model):
    id = PrimaryKeyField()
    part = ForeignKeyField(Part)
    error = ForeignKeyField(ErrorMaster)

这里产品可能有一般错误,部分可能有特定错误,这些错误是在 ErrorMaster 中预定义的

我只想知道对总产品日期有错误的产品数量。(错误是产品错误或任何部分的错误)

所以 sub_query 类似于

sub_q = Product.select(
                Product.created_date,
                Product.id.alias('product_id'),
                fn.IF(# checks if product has error
                    ProductError.is_null(True),  if no product error check part error
                    fn.IF(fn.COUNT(PartError.id) == 0, 0, 1),  # checks if error count > 0 then there is error in part
                    1
                ).alias('is_error')
            ).join(Part, on=Product.id == Part.product)
            .join(ProductError, JOIN_LEFT_OUTER, on=Product.id == ProductError.product)
            .join(PartError, JOIN_LEFT_OUTER, on=PartError.part == Part.id)
            .where(Product.created_date.between(from_date, to_date))
            .group_by(Product.id).alias('some_alias')
# below does not work but I can do this in sql
query = sub_q.select(sub_q.c.created_date,
                 fn.COUNT(sub_q.c.product_id).alias('total_products'),
        fn.SUM(sub_q.c.is_error).alias('product_with_errors'))
             .group_by(sub_q.c.created_date)

标签: subquerypeewee

解决方案


推荐阅读