
要查询每个(其实是一个列表中的)用户的最后一条评论
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 @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 |