こんなテーブルがあるとする
CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `prefecture` varchar(3) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`) );
id | name | prefecture | age |
---|---|---|---|
1 | 田中たけし | 千葉 | 18 |
2 | 岡田ひろし | 千葉 | 31 |
3 | 須藤ゆうじ | 佐賀 | 24 |
4 | 中山ひろ子 | 滋賀 | 29 |
5 | 鈴木一郎 | 滋賀 | 38 |
6 | 佐藤太郎 | 滋賀 | 55 |
よくある県ごとにグルーピングして集計するSQL
select prefecture, count(prefecture) from person group by prefecture;
sqlだとスラスラ出てくるけど、QuerySetだとちょっと考えてしまった。
以下の書き方でよさそう。
>>> from django.db.models import Count >>> Person.objects.values('prefecture').annotate(Count('prefecture')) SELECT `person`.`prefecture`, COUNT(`person`.`prefecture`) AS `prefecture__count` FROM `person` GROUP BY `person`.`prefecture` ORDER BY NULL LIMIT 21
QuerySetのsqlの確認はdjango-extensionsのshell_plusで--print-sqlすると楽
django shellで実行されるsqlを表示する - brainstorm