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つの個別のクエリを使用してそれらを処理することですパイソン。

ただし、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

たとえば、集計関数を使用minして、グループの 1 つの ID を選択してみてください。

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

max代わりに関数を使用することもできます。

2番目の解決策:

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 に答える
0

計算が実行されていない列は、GROUP BY に含める必要があります。GROUP BY ではなく SELECT でそれが必要なのはなぜですか?

于 2013-07-29T19:37:55.283 に答える