通过字段在MySQL后端查找最新的唯一查询集
假设我有一个模型:
class Calls(models.Model):
callid = models.AutoField(primary_key=True)
altid = models.BigIntegerField()
calldate = models.DateField(auto_now=True, verbose_name='Call Date')
followupdate = models.DateField(blank=True,null = True, verbose_name='Follow-up Date')
我想要做的是这个:
Calls.objects.order_by("followupdate").distinct('altid')
但是因为我在用MySQL,似乎无法对某个特定字段使用去重功能。根据文档中关于distinct
的第一条说明,当我尝试运行时会收到一个错误。错误信息是:NotImplementedError: DISTINCT ON fields is not supported by this database
下面是我的表的一个简单示例,以及我希望查询的方式。用逗号分隔的值分别代表:callid、altid、calldate 和 followupdate。
我现在拥有的是:
1,1,yesterday,thursday
2,2,yesterday,next wednesday
3,1,thursday,next thursday
我想要的是:
2,2,yesterday,next wednesday
3,1,thursday,next thursday
注意:我不能换成PostgreSQL
我该如何实现这个呢?
1 个回答
1
这可能不是最有效的解决方案(我感觉用集合可能会稍微好一点,如果集合有某种独特的lambda函数之类的……),但这个方法肯定能解决问题:
results = Calls.objects.order_by("followupdate")
newresults = []
seen_altid = []
for result in results:
if result.altid not in seen_altids:
seen_altids.append(result.altid)
newresults.append(result)
顺便说一下,如果你用这个方法,听起来你想要按照 -followupdate
来排序,这样你就能得到3,1而不是1,1。
补充一下:开个玩笑,http://www.peterbe.com/plog/uniqifiers-benchmark 似乎支持我的这个解决方案。稍微修改一下,把seen改成字典,这样查找速度可以达到O(1)。如果你需要这样做,那就很不错(不过除非你的结果集非常大,不然其实没必要这样做)。