在 peewee 中加入子查询
join a subquery in 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 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。
- 在 "inner join" 中,您使用哪些字段来映射 select 语句。例如 select A.,B. 来自 B inner join A on B.field = A.field。
我自己不熟悉 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))
我无法将以下查询转换为 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。
- 在 "inner join" 中,您使用哪些字段来映射 select 语句。例如 select A.,B. 来自 B inner join A on B.field = A.field。
我自己不熟悉 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))