1

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

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

这里我不想按 ID 列分组

有人吗?

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

4

3 回答 3

1

MySQL 文档

在标准 SQL 中,包含 GROUP BY 子句的查询不能引用选择列表中未在 GROUP BY 子句中命名的非聚合列。

这意味着在单个查询中实现您想要的唯一方法是使用OUTER JOIN语句。OUTER JOIN据我所知,Django ORM 不支持从表到自身的语句。

除了使用原始 SQL 语句之外,获得所需内容的唯一方法(所有模型的列表,包括 ID,以及每个唯一名称的出现次数)是使用 2 个单独的查询并在Python。

不过,我确实想知道,如果您不是要使用SUM而不是COUNT. COUNT为每个NON-NULL值加 1,包括0, 同时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']
于 2013-08-07T12:24:12.090 回答
0

任何未对其执行计算的列都需要包含在 GROUP BY 中。为什么要在 SELECT 中而不是在 GROUP BY 中?

于 2013-07-29T19:37:55.283 回答
0

例如,尝试使用聚合函数为min组选择一个 id。

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

您也可以改用max函数。

第二种解决方案:

select u.id, u.name, 
(select count(u1.score) from users u1 where u1.name = u.name ) as cnt
from users u
于 2013-07-29T19:42:44.007 回答