【问题标题】:Django group by id then select max timestampDjango 按 id 分组,然后选择最大时间戳
【发布时间】:2013-06-22 14:18:17
【问题描述】:

这可能是一个多余的问题,但我已经尝试过其他相关主题的先前答案,但仍然无法弄清楚。

我有一个表 Board_status 看起来像这样(每个板的多个状态和时间戳):

time      | board_id | status
-------------------------------
2012-4-5  |        1 | good

2013-6-6  |        1 | not good

2013-6-7  |        1 | alright

2012-6-8  |        2 | good

2012-6-4  |        3 | good

2012-6-10 |        2 | good

现在我想从 Board_status 表中选择所有记录,按 board_id 对所有记录进行分组以获得不同的 board_id,然后选择每个板上的最新状态。基本上以这样的表格结束(只有每个板的最新状态和时间戳):

time      | board_id | status
------------------------------
2013-6-7  |        1 | alright

2012-6-4  |        3 | good

2012-6-10 |        2 | good

我试过了:

b = Board_status.objects.values('board_id').annotate(max=Max('time')).values_list('board_id','max','status')

但它似乎不起作用。每个 board_id 仍然给我超过 1 条记录。

我应该在 Django 中使用哪个命令来执行此操作?

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    更新,这是我使用的解决方案。不是最好的,但目前可以使用:

    b=[]
    a = Board_status.objects.values('board_id').distinct()
    for i in range(a.count()):
     b.append(Board_status.objects.filter(board_id=a[i]['board_id']).latest('time'))
    

    所以我得到了所有 board_id,存储到列表 a 中。然后对于每个 board_id,再进行一次查询以获取最新时间。仍然欢迎任何更好的答案。

    【讨论】:

      【解决方案2】:

      它将如何运作?您既没有过滤器也没有不同的过滤器来过滤掉重复项。我不确定这是否可以在单个 django 查询中轻松完成。您应该阅读更多内容:

      1. https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct
      2. https://docs.djangoproject.com/en/1.4/topics/db/aggregation/

      如果您无法在 1 个原始 sql 查询中执行此操作,则您也无法使用 OR 映射器执行此操作,因为它构建在 mysql 之上(在您的情况下)。你能告诉我你将如何通过原始 SQL 做到这一点吗?

      【讨论】:

      • 我认为你是对的。我一直在尝试在原始 SQL 中执行此操作,但也无法在 1 个查询中获得它。我正在考虑将所有 board_id 读入一个数组,然后从该数组执行一个 for 循环到数据库以获取最新记录。不过如果我的桌子变大就麻烦了……
      猜你喜欢
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2017-03-25
      • 2011-07-14
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多