Django Group通过查询

时间:2014-07-07 12:04:07

标签: mysql django python-2.7 django-orm

我有一个包含以下列的表:

class Table1(models.Model):
    avg_value=models.CharField('Avg Value',)
    sys_timestamp = models.IntegerField('SYS Timestamp')

现在我想做这个mysql查询:

select max(id), avg_value, sys_timestamp from Table1 group by sys_timestamp order by id desc limit 10;

我只想在结果中使用max_id和avg_value以及sys_timestamp 如果可能,仅使用sys_timestamp和avg_value示例[[1404385800L,-34],[1404385500L,-45].............] 使用Django ORM将group_by改为sys_timestamp。

我尝试了以下但未能获得所需的结果。

Table1.objects.values_list('sys_timestamp','avg_value').annotate(max_id=Max('id')).order_by('-id')[:10]

如果我这样做:

    print (Table1.objects.values_list('sys_timestamp','avg_value').annotate(max_id=Max('id')).order_by('-id')[:10]).query

SELECT Table1.sys_timestamp, Table1.avg_value, MAX(Table1.id) AS max_id FROM Table1 GROUP BY Table1.sys_timestamp, Table1.avg_value ORDER BY Table1.id DESC LIMIT 10

order_by包含sys_timestampavg_value,不是必需的。

如果我这样做:

(PerformanceService.objects.only('avg_value','sys_timestamp').values('sys_timestamp').annotate(max_id=Max('id')).order_by('-id')[:6]).query

SELECT Table1.sys_timestamp, MAX(Table1.id) AS max_id FROM Table1 GROUP BY Table1.sys_timestamp ORDER BY Table1.id DESC LIMIT 6

此回报:

[{'sys_timestamp': 1404385800L, 'max_id': 7380}, {'sys_timestamp': 1404385500L, 'max_id': 7370}, {'sys_timestamp': 1404385200L, 'max_id': 7360}.............]

但要求是

[{'sys_timestamp': 1404385800L, 'max_id': 7380, avg_value:-34}, {'sys_timestamp': 1404385500L, 'max_id': 7370, avg_value:-39}, {'sys_timestamp': 1404385200L, 'max_id': 7360, avg_value:-23}.............]

任何想法。 ?

1 个答案:

答案 0 :(得分:0)

您声明要实现此查询:

  

select max(id), avg_value, sys_timestamp from Table1 group by sys_timestamp order by id desc limit 10;

你想要什么在技术上是错误的。您不能在SELECT子句中使用不在GROUP BY子句中的列(可能有多个avg_valuesys_timestamp相关联。)

如果您确定每个avg_value只有一个sys_timestamp,则可以使用此功能:

Table1.objects.values('sys_timestamp').annotate(max_id=Max('id'), avg_val=Max('avg_value')).order_by('-max_id')[:10]

请注意,我使用Max(' avg_value')作为黑客攻击,等于唯一的avg_value