python - 如何选择列而不在 group by 子句中放置非聚合列

标签 python sql django model group-by

我想知道如何选择列而不将它们放在 group by 子句中 例如:

select id, name, count(score) from users
group by name
order by count(score) desc

这里我不想按ID列分组

有人吗?

提示:Django 不允许我使用 min、max、avg、top,我需要强制选择没有函数的 ID。

最佳答案

来自MySQL documentation :

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 而不是 COUNTCOUNT 为每个 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/

相关文章:

python - Redis 和 Django

python - 将数组数组转换为扁平数据框

python - 如何使用 django-filters 重命名(在 API 中公开)过滤器字段名称?

sql - 取消透视从另一个表中获取的列

python - 如何使用 Py Dict SetDefault 来获取默认值的引用计数

mysql - 查询没有像预期的那样工作

mysql - 这个MySQL连接查询可以优化吗?

Django:使用 Django ORM 实现 JOIN?

python - Django makemigrations错误

django 时区被视为 UTC,即使我已将其设置为 'Asia/Kolkata'