我有一个像这样的架构:
PetOwner:
owner_id | first_name | last_name
---------------------------------
1 | john | smith
2 | jane | doe
3 | jack | jones
Pets:
pet_id | owner_id | name | type
-------------------------------
1 | 1 | a | dog
2 | 1 | b | dog
3 | 1 | c | dog
4 | 1 | d | cat
5 | 1 | e | cat
6 | 1 | f | fish
7 | 2 | g | dog
8 | 2 | h | dog
9 | 2 | i | fish
10 | 3 | j | dog
我想写一个查询给我:
first_name | last_name | dog_count | cat_count | fish_count
-----------------------------------------------------------
john | smith | 3 | 2 | 1
jane | doe | 2 | 0 | 1
jack | jones | 1 | 0 | 0
有一组已知的宠物类型,因此不需要为任意类型创建列。此外,任何没有特定类型宠物的所有者都应获得该宠物类型的 0 计数。
我已经尝试过如下查询:
SELECT first_name, last_name, owner_id, type, COUNT(*)
FROM Pets, PetsOwner
GROUP_BY owner_id, type
产生:
first_name | last_name | owner_id | type | COUNT(*)
---------------------------------------------------
john | smith | 1 | dog | 3
john | smith | 1 | cat | 2
john | smith | 1 | fish | 1
jane | doe | 2 | dog | 2
jane | doe | 2 | fish | 1
jack | jones | 3 | dog | 1
但这需要对结果集进行迭代以获得我正在寻找的输出,这显然是 SQL 需要避免的。此外,它不为表格中不存在的宠物类型提供默认值 0 值。
是否可以使用一个 SQL 查询来做到这一点?如果没有,是否有比我找到的查询更好(即更容易使用)的查询?
它是一个 MySQL 数据库,如果这有所作为的话。
谢谢您的帮助。