sql - peewee 是否可以嵌套 SELECT 查询,以便外部查询在内部查询的聚合上进行选择?

标签 sql python-3.x sqlite peewee

我将 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 完成这些查询。

最佳答案

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

您可以在这里看到该线程:https://groups.google.com/forum/#!topic/peewee-orm/FSHhd9lZvUE

但这是重要的部分,我是从 Charles 对我的帖子的回复中复制的:

I've added a couple commits to master which should make your queries possible (https://github.com/coleifer/peewee/commit/22ce07c43cbf3c7cf871326fc22177cc1e5f8345).

Here is the syntax,roughly, for your first example:

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))

This yields the following 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

关于sql - peewee 是否可以嵌套 SELECT 查询,以便外部查询在内部查询的聚合上进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297971/

相关文章:

mysql - 如何使用 Mysql rand() 结果两次?

sql - T-SQL。如何在没有光标的情况下将 Item[i] 和 Item[i-1] 选择到同一行

php - sql group by 重复结果

java - 正则表达式选择下划线之间的所有字符

python - 如何按顺序获取Python中类的所有成员?

SQLite - GROUP BY 行,仅当某些列与另一列匹配时

javascript - SQLite 数据库插入时难以转义单引号字符

mysql - SQL 语句 - 选择此查询的逆语句

Python - Tkinter(ttk)动态创建一个进度条,其自身的值会发生变化

android - 无法将列动态添加到 sqlite 表中