3

我有一个充满口袋妖怪卡片的数据库,我想做一个查询以找到每种类型的 HP 最高的口袋妖怪。我希望视图只显示该口袋妖怪的名称、类型和 HP。

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

我有这个代码。它返回最大 HP,但不返回正确的口袋妖怪。此代码是否会为单一类型显示具有相同 HP 的多行?

4

3 回答 3

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 的那些。

这将显示单个类型具有相同 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

Partition by'Type'group by

优点是您不需要将表与自身连接,并且您可以在选择中选择您想要的任何列。包括像 Id 这样的列,这在按方案分组中是不可能的。(组中的 ID 意味着每条记录在结果中都有自己的行,当然如果 ID 是唯一的)

于 2012-11-07T08:11:05.643 回答
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 回答
0

我还没有在 mysql 上测试过这个,但是 subselect join 应该可以工作

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 回答