Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在peewee中加入子查询_Python_Peewee - Fatal编程技术网

Python 在peewee中加入子查询

Python 在peewee中加入子查询,python,peewee,Python,Peewee,我一直在将下面的查询转换为peewee: SELECT bID, taskCount FROM ( SELECT block.id AS bID, Count( task.id ) AS taskCount FROM block LEFT JOIN task ON task.block_id = block.id WHERE block.id NOT IN ( ( SELECT

我一直在将下面的查询转换为peewee:

SELECT bID, taskCount 
FROM
    (
    SELECT
        block.id AS bID,
        Count( task.id ) AS taskCount 
    FROM
        block
        LEFT JOIN task ON task.block_id = block.id 
    WHERE
        block.id NOT IN ( ( SELECT task.block_id FROM task WHERE task.channel_id = '1' ) ) 
    GROUP BY
        block.id 
    ) AS A
    INNER JOIN ( SELECT task.block_id FROM task GROUP BY task.block_id ) AS B
我知道这是可以做到的,但我无法编写完整的解决方案,因为我不知道如何处理别名(BID、TaskCount),然后在哪里使用连接

这是我写的,显然不起作用:

subquery1 = (Block.select(Block.id.alias('BID'),fn.COUNT(Task.id).alias('TaskCount'))
 .join(Task,JOIN.LEFT_OUTER,Task.block_id == Block.id)
 .where(Block.id.not_in(Task.select(Task.block_id).where(Task.channel_id=='1')))
 .group_by(Block.id)
 .alias('subquery1'))

subquery2 = (Task.select(Task.block_id).group_by(Task.block_id) )
query = subquery1.select(subquery1.c.BID,subquery1.c.TaskCount)
 .join(subquery2, on=(subquery1.c.BID == subquery2.c.block_id))
编辑:我修正了一些错误。但现在我应该从查询对象中得到什么?!! 如果打印查询的行,我将面临:

peewee.InternalError: (1054, "Unknown column 'subquery1.BID' in 'field list'")

我发现您在开始的查询中缺少一些信息。您应该指定:

  • 在“from”中,字段是否来自select语句A或B
  • 在“内部联接”中,使用哪些字段映射select语句。例如,从B中选择A,B。在B.field=A.field上内部连接A

我自己对Peewee并不熟悉,但希望这会有所帮助。

最后,在上下波动后,我注意到一个问题,我的代码中有一个额外的部分被我删除了

subquery2 = (Task.select(Task.block_id).group_by(Task.block_id) )
query = subquery1.select(subquery1.c.BID,subquery1.c.TaskCount).join(subquery2, on=(subquery1.c.BID == Task.block_id))
正确的部分是:

subquery1 = (Block
.select(Block.id.alias('BID'),fn.COUNT(Task.id).alias('TaskCount')
                 ).join(Task,JOIN.LEFT_OUTER,Task.block_id == Block.id)
                 .where(Block.id.not_in(Task.select(Task.block_id).where(Task.channel_id=='1')))
                 .group_by(Block.id)
                 .alias('subquery1')).order_by(fn.COUNT(Task.id))

您共享的SQL是否实际执行并执行您期望的操作?对我来说,它看起来非常糟糕。是的,虽然sql代码工作得很好,但我认为它写得有点不标准!没有什么建议吗?