要查询每个(其实是一个列表中的)用户的最后一条评论
Model定义伪代码
class Comment():
user_id
text
create_time
查询user_id in [1,2,3,4,5]中的的最后一条评论,用Django ORM怎么写? 如果不行的话,SQL怎么写呢
1
yzongyue 2015-06-21 15:41:22 +08:00
我觉得吧,,,
Model定义伪代码 class Comment(): user text create_time 然后, clist = [] for u_id in u_ids: c = Comment.objects.filter(user__id__exact=u_id).order_by('create_time')[0] clist += c 命名不规范,大体这意思 |
2
dingyaguang117 OP @yzongyue 现在要一条sql出结果。。。
|
3
tini20 2015-06-21 16:51:23 +08:00
要想速度好,这个最好用一个专门的表存储
|
4
dalang 2015-06-21 19:56:06 +08:00 1
@yzongyue 感觉可以写成
Comment.objects.filter(user__id__in=u_ids).latest('create_time') |
5
dingyaguang117 OP @dalang 这样是只返回所有里面最新的一条吧?
|
7
dalang 2015-06-21 22:17:03 +08:00
@dingyaguang117 确实误解题意了
没想到一句 sql 的方法。能想到两条 sql 的,先求出每个 user 对应最新评论的日期:condition_list = Comment.objects.values('user').annotate(create_time=Max('create_time')) 会得到一个类似[{'create_time': datetime.datetime(2015, 5, 21, 11, 15, 57, tzinfo=<UTC>), 'user': 1L}...] 的 list 然后用一个 sql 把对应的评论找出来 query = reduce(lambda q,v: q|(Q(user=v['user')&Q(create_time=v['create_time'])), condition_list, Q()) Comment.objects.filter(query) |
8
dingyaguang117 OP @dalang 我现在就是这样,第二个用in就可以了
|
9
dingyaguang117 OP @dalang django好像对 group by 的控制比较让人费解。。。似乎子查询也必须用raw sql
|
10
aggron 2015-06-22 08:14:15 +08:00
希望你用的是postgre,那可以用这样的raw sql:
select * from comment c where id in ( select id from comment c1 where c2.userId in (1,2,3,4) and c1.useId=c.userId limit 1) 如果myaql,参考 /t/198719 |
11
aggron 2015-06-22 08:19:15 +08:00
typo,应该是c1.userId in
|