我想知道如何选择列而不将它们放在 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。
从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']
任何未对其执行计算的列都需要包含在 GROUP BY 中。为什么要在 SELECT 中而不是在 GROUP BY 中?
例如,尝试使用聚合函数为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