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つの個別のクエリを使用してそれらを処理することですパイソン。
ただし、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']
たとえば、集計関数を使用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
計算が実行されていない列は、GROUP BY に含める必要があります。GROUP BY ではなく SELECT でそれが必要なのはなぜですか?