ポケモンカードでいっぱいのデータベースがあり、クエリを実行して、タイプごとにHPが最も高いポケモンを見つけたいと思います。そのポケモンの名前、種類、HPだけを表示したい。
SELECT MAX(HP), Type, name FROM `Pokemon` group by Type
私はこのコードを持っています。最大HPを返しますが、正しいポケモンは返しません。このコードは、単一のタイプに対して同じHPの複数の行を表示しますか?
ポケモンカードでいっぱいのデータベースがあり、クエリを実行して、タイプごとにHPが最も高いポケモンを見つけたいと思います。そのポケモンの名前、種類、HPだけを表示したい。
SELECT MAX(HP), Type, name FROM `Pokemon` group by Type
私はこのコードを持っています。最大HPを返しますが、正しいポケモンは返しません。このコードは、単一のタイプに対して同じHPの複数の行を表示しますか?
代わりにこれを試してください:
SELECT p2.MAXHP, p2.Type, p1.name
FROM `Pokemon` p1
INNER JOIN
(
SELECT Type, MAX(HP) MaxHP
FROM Pokemon
GROUP BY Type
) p2 ON p1.type = p2.type AND p1.HP = p2.MaxHP
これにより、最大HPのすべてのポケモン名が表示されます。
Select HP, Type, Name
from `Pokemon` P inner join
(Select Type, Max(HP) MaxHP from `Pokemon` group by Type) MaxPerType
on P.Type = MaxPerType.Type and P.HP = MaxPerType.MaxHP
これにより、ポケモンの種類ごとに最も高いHPのリストが表示されます
MaxPerType
はタイプごとの最高のHPのリストです。次に、これを利用可能なすべてのポケモンの合計リストと結合し、タイプごとの最高のHPを持つものだけを除外します。
これにより、1つのタイプに対して同じHPの複数の行が表示されます。
ところで、mssqlサーバーには'OVER (PARTITION BY'
機能があります。これは少し簡単で、おそらく高速です。これがmysqlに存在するかどうかわからない
構文は次のようになります。
Select HP, Type, Name from
(Select HP, Type, Name,
ISNULL((ROW_NUMBER() OVER (PARTITION BY Type order by HP DESC)),0) As Ranking
from `Pokemon`) P
where P.ranking = 1
最高(最大)のP.Ranking = 1
HPのみが得られます
によるパーティション'Type'
は、group by
利点は、テーブルをそれ自体と結合する必要がなく、選択で任意の列を選択できることです。Idのような列を含みます。これは、groupbyシナリオでは不可能です。(グループ内のIdは、もちろんIdが一意である場合、すべてのレコードが結果に独自の行を取得することを意味します)
私はこれをmysqlでテストしていませんが、副選択結合は機能するはずです
SELECT name from 'Pokemon' as p INNER JOIN (SELECT Max(HP) as maxhp, Type FROM 'Pokemon' GROUP BY TYPE) as maxh on maxhp = p.hp and maxh.Type = p.Type
これは、最大の健康状態を持つ各カテゴリの各ポケモンの名前を返します