2014-01-23 88 views
2

我正在使用peewee2.1與python3.3和sqlite3.7數據庫。可以peewee嵌套SELECT查詢以便外部查詢選擇內部查詢的聚合嗎?

我想執行某些SELECT查詢,其中:

  1. 我首先選擇一些集合體(計數,總和)中,由一些id列分組;然後
  2. 然後我從(1)的結果中進行選擇,在其總量上進行聚合。具體來說,我想要計算(1)中具有每個聚合值的行數。

我的數據庫有一個'Event'表,每個事件有一條記錄,'Ticket'表有每個事件1..N個票。每張票據記錄都包含事件的ID作爲外鍵。每張門票還包含一個「座位」列,用於指定購買的座位數量。 (A「票」是作爲在活動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來完成這些查詢。

回答

5

我在peewee-orm Google小組上發佈了同樣的問題。 Charles Leifer及時回覆了對peewee master的答覆和新承諾。所以儘管我回答了我自己的問題,但顯然所有的功勞都歸功於他。

你可以看到線程這裏:https://groups.google.com/forum/#!topic/peewee-orm/FSHhd9lZvUE

但這裏的重要組成部分,我已經從查爾斯的迴應複製到我的帖子:

我添加了一對夫婦承諾掌握這應該使您的查詢 可能 (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 
+0

感謝在這裏張貼的解決方案,我敢肯定,這將再來!順便問一句,真正讓我想到一些方法來改進一些API。 – coleifer