我有一个充满精灵宝可梦卡片的数据库,我想做一个查询,以找到每种类型中拥有最高HP的精灵宝可梦。我希望视图只显示pokemon的名称、类型和HP。
SELECT MAX(HP), Type, name FROM `Pokemon` group by Type我有这个代码。它返回最大HP值,但不返回正确的Pokemon。对于单个类型,此代码是否会显示具有相同HP的多行?
发布于 2012-11-07 15:46:58
试着这样做:
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-07 16:11:06
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这将为您提供每种Pokemon类型的所有最高HP的列表
MaxPerType是每种类型的最高生命值列表,然后你将其与所有可用口袋妖怪的总列表相结合,并只过滤出每种类型拥有最高生命值的那些。
这将为单个类型显示具有相同HP的多个行。
BTW在mssql server中提供了'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 = 1P.Ranking = 1将仅为您提供最高(最大) HP
'Type'分区与group by分区具有相同的效果
优点是您不需要将表与其自身联接,并且可以在select中选择任何所需的列。包括像Id这样的列,这在group by方案中是不可能的。(组中的Id by意味着每条记录在结果中都有自己的行,当然,如果Id是唯一的)
发布于 2012-11-07 15:53:07
我还没有在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这将返回每个类别中具有最大健康值的每个Pokemon的名称
https://stackoverflow.com/questions/13265250
复制相似问题