peewee可以嵌套SELECT查询,以便外部查询选择内部查询的聚合吗?

时间:2014-01-23 02:05:53

标签: sql python-3.x sqlite peewee

我正在使用peewee2.1和python3.3以及sqlite3.7数据库。

我想执行某些SELECT查询,其中包括:

  1. 我首先选择一些聚合(计数,总和),按一些id列分组;那么
  2. 然后我从(1)的结果中选择,聚合其聚合。具体来说,我想计算(1)中具有每个聚合值的行数。
  3. 我的数据库有一个'Event'表,每个事件有1条记录,还有一个'Ticket'表,每个事件有1..N票。每个故障单记录都包含事件的id作为外键。每张票还包含一个“席位”列,用于指定购买的座位数。 (“门票”最好被认为是活动中一个或多个席位的购买交易。)

    以下是使用此类SQLite查询的两个示例,它们可以提供所需的结果:

    SELECT ev_tix, count(1) AS ev_tix_n FROM 
    (SELECT count(1) AS ev_tix FROM ticket GROUP BY event_id)
    GROUP BY ev_tix
    
    SELECT seat_tot, count(1) AS seat_tot_n FROM
    (SELECT sum(seats) AS seat_tot FROM ticket GROUP BY event_id)
    GROUP BY seat_tot
    

    但是使用Peewee,我不知道在指定外部查询时如何选择内部查询的聚合(计数或总和)。我当然可以为该聚合指定一个别名,但似乎我不能在外部查询中使用该别名。

    我知道Peewee有一个执行“原始”SQL查询的机制,我已经成功地使用了这种解决方法。但我想了解是否/如何使用Peewee直接完成这些查询。

1 个答案:

答案 0 :(得分:5)

我在peewee-orm Google小组上发布了同样的问题。 Charles Leifer迅速回应了对小便大师的回答和新的承诺。因此,虽然我正在回答我自己的问题,但显然所有的归功于他。

您可以在此处看到该主题:https://groups.google.com/forum/#!topic/peewee-orm/FSHhd9lZvUE

但这是必不可少的部分,我从Charles对我的帖子的回复中复制了这些内容:

  

我添加了一些提交给master的提交,这些提交应该可以进行查询   可能   (https://github.com/coleifer/peewee/commit/22ce07c43cbf3c7cf871326fc22177cc1e5f8345)。

     

大致上,这是第一个例子的语法:

SELECT ev_tix, count(1) AS ev_tix_n FROM 
(SELECT count(1) AS ev_tix FROM ticket GROUP BY event_id)
GROUP BY ev_tix
ev_tix = SQL('ev_tix')  # the name of the alias.
(Ticket
 .select(ev_tix, fn.count(ev_tix).alias('ev_tix_n'))
 .from_(
     Ticket.select(fn.count(Ticket.id).alias('ev_tix')).group_by(Ticket.event))
.group_by(ev_tix))
     

这会产生以下SQL:

SELECT ev_tix, count(ev_tix) AS ev_tix_n FROM (SELECT Count(t2."id") 
AS ev_tix FROM "ticket" AS t2 GROUP BY t2."event_id")
GROUP BY ev_tix