想象一下以下媒体表:
| site | show_id | time |
| ---------------------|-------|
| CNN | 1 | 'a' |
| ABC | 2 | 'b' |
| ABC | 5 | 'c' |
| CNN | 3 | 'd' |
| NBC | 4 | 'e' |
| NBC | 5 | 'f' |
--------------------------------
Run Code Online (Sandbox Code Playgroud)
我想迭代由show_id分组的查询结果并尝试过这个查询:
listings = session.query(Media).filter(Media.site == "CNN").group_by(Media.show_id).all()
Run Code Online (Sandbox Code Playgroud)
以下是我想迭代结果的方法:
for showtimes in listings:
for show in showtimes:
print(show.time)
Run Code Online (Sandbox Code Playgroud)
但该查询并未向我提供所有已分组的子对象.我错过了什么?
Ilj*_*ilä 10
在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'))]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |