次のようなスキーマがあります。
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 も提供しません。
1 つの SQL クエリでこれを行うことは可能ですか? そうでない場合、私が見つけたクエリよりも優れた (つまり、操作しやすい) クエリはありますか?
それが違いを生むなら、それはMySQLデータベースです。
助けてくれてありがとう。