Скажем, у меня такая таблица mysql.
| id | type | sub_type | customer |
| 1 | animal | cat | John |
| 2 | animal | dog | Marry |
| 3 | animal | fish | Marry |
| 3 | animal | bird | John |
Я должен собирать данные по клиентам и подсчитывать строки по типу sub_type. У животного есть 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}
]
Таким образом, sub_type, который не находится в базе данных, должен быть возвращен с 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
Тем не менее, я хочу знать, есть ли другой способ или более элегантный способ сделать это.
Предполагая, что у вас есть таблица с именем "люди", которая содержит поле "имя", в котором есть записи
name
--------
John
Mary
Mathew
и таблица, упомянутая выше, представляет собой таблицу под названием "домашние животные",
Вы можете использовать следующий запрос для создания вашего результирующего набора для каждого человека
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 и отфильтруйте мое имя или дайте итоговый результат для всех сразу.
pandas
?mysql
, поэтому я добавил этот тег в ваш вопрос - речь идет не об использовании универсального Python.