我想知道如何选择列而不将它们放在 group by 子句中 例如:
select id, name, count(score) from users
group by name
order by count(score) desc
这里我不想按ID列分组
有人吗?
提示:Django 不允许我使用 min、max、avg、top,我需要强制选择没有函数的 ID。
最佳答案
In standard SQL, a query that includes a GROUP BY clause cannot refer to nonaggregated columns in the select list that are not named in the GROUP BY clause.
这意味着在单个查询中实现您想要的结果的唯一方法是使用OUTER JOIN
语句。据我所知,Django ORM 不支持从表到自身的 OUTER JOIN 语句。
除了使用原始 SQL 语句之外,获得所需内容(所有模型的列表,包括 ID,以及每个唯一名称出现次数的计数)的唯一方法是使用 2 个单独的查询和用 Python 处理它们。
不过,我确实想知道您是否不想使用 SUM
而不是 COUNT
。 COUNT
为每个 NON-NULL
值(包括 0
)加 1,而 SUM
将实际数值添加到柱子。
无论如何,一个例子如下:
qs = Foo.objects.values('name').annotate(count=Count('id')) # or sum=Sum('score')
count = dict((x['name'], x['count']) for x in qs)
object_list = Foo.objects.all()
for foo in object_list:
foo.count = count['name']
关于python - 如何选择列而不在 group by 子句中放置非聚合列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17932695/