首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按类型查询返回HP的Pokemon

按类型查询返回HP的Pokemon
EN

Stack Overflow用户
提问于 2012-11-07 15:44:53
回答 3查看 151关注 0票数 3

我有一个充满精灵宝可梦卡片的数据库,我想做一个查询,以找到每种类型中拥有最高HP的精灵宝可梦。我希望视图只显示pokemon的名称、类型和HP。

代码语言:javascript
复制
SELECT MAX(HP), Type, name FROM `Pokemon` group by Type

我有这个代码。它返回最大HP值,但不返回正确的Pokemon。对于单个类型,此代码是否会显示具有相同HP的多行?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-07 15:46:58

试着这样做:

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2012-11-07 16:11:06

代码语言:javascript
复制
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中是否存在

语法为:

代码语言:javascript
复制
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分区具有相同的效果

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-07 15:53:07

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

代码语言:javascript
复制
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的名称

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13265250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档