3

ポケモンカードでいっぱいのデータベースがあり、クエリを実行して、タイプごとにHPが最も高いポケモンを見つけたいと思います。そのポケモンの名前、種類、HPだけを表示したい。

SELECT MAX(HP), Type, name FROM `Pokemon` group by Type

私はこのコードを持っています。最大HPを返しますが、正しいポケモンは返しません。このコードは、単一のタイプに対して同じHPの複数の行を表示しますか?

4

3 に答える 3

2

代わりにこれを試してください:

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のすべてのポケモン名が表示されます。

于 2012-11-07T07:46:58.020 に答える
2
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 = 1HPのみが得られます

によるパーティション'Type'は、group by

利点は、テーブルをそれ自体と結合する必要がなく、選択で任意の列を選択できることです。Idのような列を含みます。これは、groupbyシナリオでは不可能です。(グループ内のIdは、もちろんIdが一意である場合、すべてのレコードが結果に独自の行を取得することを意味します)

于 2012-11-07T08:11:05.643 に答える
0

私はこれを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

これは、最大の健康状態を持つ各カテゴリの各ポケモンの名前を返します

于 2012-11-07T07:53:06.577 に答える