想象下面的媒体表:
| site | show_id | time | | ---------------------|-------| | CNN | 1 | 'a' | | ABC | 2 | 'b' | | ABC | 5 | 'c' | | CNN | 3 | 'd' | | NBC | 4 | 'e' | | NBC | 5 | 'f' | --------------------------------
我想遍历由show_id分组的查询结果,并尝试过以下查询:
listings = session.query(Media).filter(Media.site == "CNN").group_by(Media.show_id).all()
这是我要遍历结果的方式:
for showtimes in listings: for show in showtimes: print(show.time)
但是该查询并不能给我所有分组的子对象。我想念什么?
在SQL中,GROUP BY子句根据分组表达式 将分组的行压缩为单个行 。我的猜测是您正在使用SQLite或MySQL的较早版本,因为允许您选择非聚合,而它们在功能上不依赖于分组表达式。在这种情况下,结果包含每个组中未指定行的值,因此很少(如果有的话)很有用。
一个解决方案是在SQL中使用ORDER BY而不是GROUP BY,然后根据订单表达式在Python中进行分组:
from itertools import groupby from operator import attrgetter listings = session.query(Media).\ filter(Media.site == "CNN").\ order_by(Media.show_id).\ all() # Materialize the subiterators to lists listings = [list(g) for k, g in groupby(listings, attrgetter('show_id'))]