gpt4 book ai didi

sql - Django限制分组查询的方法

转载 作者:行者123 更新时间:2023-11-29 12:21:58 25 4
gpt4 key购买 nike

我想为每个日期返回 3 个结果,并按日期和每个查询的单独“评级”列对结果进行排序

例如,我的查询会返回如下内容:

Event on Dec 1st rated 36
Event on Dec 1st rated 29
Event on Dec 1st rated 12
Event on Dec 2nd rated 45
Event on Dec 2nd rated 12
Event on Dec 2nd rated 9
Event on Dec 3rd rated 118
Event on Dec 3rd rated 15
Event on Dec 3rd rated 13

我知道这应该可以使用像这样的原始 sql:SQL group - limit

但我想知道在 Django ORM 中是否有一种方法可以在单个查询中执行此操作,或者如果我确实需要转换为原始 SQL 查询,至少有一种方法可以使其尽可能轻松。

编辑:模型很简单。相关领域是:

class Event(models.Model):
title = models.CharField(max_length=120)
day = models.DateField()
score = models.SmallIntegerField()

最佳答案

我试图组装一个查询集的联合,但 django 提示:

AssertionError
Cannot combine queries once a slice has been taken.

这是 View 代码:

def home2(request):

dates_qs = Event.objects.values('day').order_by('day').distinct()

ev_qss = []
for date in dates_qs:
my_qs = Event.objects.filter(day=date['day']).order_by('score')[:3]
ev_qss.append(my_qs)

answer_qs = ev_qss[0]
for qs in ev_qss[1:]:
answer_qs |= qs

return render_to_response ('home2.html',
{'dates_qs':dates_qs,
'answer_qs':answer_qs},
RequestContext(request))

错误是针对 answer_qs |= qs 行发出的,即想要取 answer_qs 和 qs 的并集。 qs 是一个日期分数的查询集,限制为 3 个结果。

所以我猜你被原始 SQL 困住了。您指向的原始 SQL 示例在多个表中有数据,而您的所有数据都在一个表中,因此您的 SQL 更简单一些:

SELECT sE.* FROM so_event AS sE
WHERE 3>(
SELECT COUNT(*)
FROM so_event iE
WHERE iE.day = sE.day AND
sE.score - iE.score < 0
)
ORDER BY sE.day ASC, sE.score DESC;

现在我知道这是我们的目标查询,我搜索了 django orm 子查询,并遇到了这篇 SO 文章和答案:

How to django ORM with a subquery?

它说了一大堆东西,并暗示你可以用不同的 ORM (SQLAlchemy) 做你想做的事。我听说过有关 SQLAlchemy 的好消息。

关于sql - Django限制分组查询的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com