我有一个充满口袋妖怪卡片的数据库,我想做一个查询以找到每种类型的 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 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 是唯一的)
试试这个:
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 的口袋妖怪名称。
我还没有在 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
这将返回每个类别中具有最大生命值的每个口袋妖怪的名称