python—收集数据、计数并返回字典列表,即使数据不存在

k10s72fa  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(348)

假设我有这样一个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

然而,我想知道是否有其他方法或更优雅的方法来做到这一点。

sczxawaw

sczxawaw1#

假设您有一个名为“people”的表,其中包含包含条目的字段“name”

name
--------
John
Mary
Mathew

上面提到的那张table叫“宠物”
您可以使用以下查询为每个人构建结果集

select
  A.name as customer,
  (select count(*) from pets where customer=A.name and sub_type='cat') as cat,
  (select count(*) from pets where customer=A.name and sub_type='dog') as dog,
  (select count(*) from pets where customer=A.name and sub_type='fish') as fish,
  (select count(*) from pets where customer=A.name and sub_type='bird') as bird
from people A

结果如下

customer    cat     dog     fish    bird
John        1       0       0       1
Marry       0       1       1       0
Mathew      0       0       0       0

添加一个额外的where子句并过滤我的名字,或者一次为所有人提供摘要结果。

相关问题