假设我有这样一个mysql表。
| id | type | sub_type | customer |
| 1 | animal | cat | John |
| 2 | animal | dog | Marry |
| 3 | animal | fish | Marry |
| 3 | animal | bird | John |
我要做的是按客户收集数据,按子类型计算行数。动物类型有4种亚型( cat
, dog
, fish
, bird
)约翰有两种类型( cat
, bird
)以及 Marry
也有两个子类型( dog
, fish
). 假设我想得到 John
,应该是这样的。
[
{name='cat', count=1},
{name='dog', count=0},
{name='fish', count=0},
{name='bird', count=1}
]
当我想得到一个关于 Marry
,应该是这样的。
[
{name='cat', count=0},
{name='dog', count=1},
{name='fish', count=1},
{name='bird', count=0}
]
因此,不在数据库中的子类型应该返回 count
第0页。假设我想得到 Matthew
. 因为没有 Matthew
,结果应该是这样的。
[
{name='cat', count=0},
{name='dog', count=0},
{name='fish', count=0},
{name='bird', count=0}
]
我通常用 setdefault()
产生结果。我的代码可能是这样的。
tmp = dict()
for row in queryset:
tmp.setdefault(row.customer, dict(cat=0, dog=0, fish=0, bird=0))
if row.sub_type == 'cat':
tmp[row.customer][row.sub_type] += 1
然而,我想知道是否有其他方法或更优雅的方法来做到这一点。
1条答案
按热度按时间sczxawaw1#
假设您有一个名为“people”的表,其中包含包含条目的字段“name”
上面提到的那张table叫“宠物”
您可以使用以下查询为每个人构建结果集
结果如下
添加一个额外的where子句并过滤我的名字,或者一次为所有人提供摘要结果。