【问题标题】:Can peewee nest SELECT queries such that the outer query selects on an aggregate of the inner query?peewee 可以嵌套 SELECT 查询,以便外部查询选择内部查询的聚合吗?
【发布时间】:2014-02-13 09:34:20
【问题描述】:

我将 peewee2.1 与 python3.3 和一个 sqlite3.7 数据库一起使用。

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

  1. 我首先选择一些聚合(计数,总和),按一些 id 列分组;那么
  2. 然后我从 (1) 的结果中进行选择,并对其聚合进行聚合。具体来说,我想计算 (1) 中具有每个聚合值的行数。

我的数据库有一个“事件”表,每个事件有 1 条记录,还有一个“票”表,每个事件有 1..N 个票。每个工单记录都包含事件的 id 作为外键。每张票还包含一个“座位”列,指定购买的座位数。 (“门票”实际上最好被视为在活动中购买 1 个或多个席位的交易。)

以下是此类工作 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 完成。

【问题讨论】:

    标签: sql python-3.x sqlite peewee


    【解决方案1】:

    我在 peewee-orm Google 群组上发布了同样的问题。 Charles Leifer 迅速回应了 peewee master 的答案和新的提交。因此,尽管我在回答自己的问题,但显然所有功劳都归于他。

    你可以在这里看到那个帖子:https://groups.google.com/forum/#!topic/peewee-orm/FSHhd9lZvUE

    但这是我从查尔斯对我的帖子的回复中复制的基本部分:

    我已经向 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
    

    【讨论】:

    • 感谢您在这里发布解决方案,我相信这会再次出现!顺便说一句,这个问题很好,确实让我想到了一些改进某些 API 的方法。
    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多