通过字段在MySQL后端查找最新的唯一查询集

0 投票
1 回答
1109 浏览
提问于 2025-04-17 16:49

假设我有一个模型:

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)。如果你需要这样做,那就很不错(不过除非你的结果集非常大,不然其实没必要这样做)。

撰写回答