2012-11-07 73 views
4

我有一個充滿Pokemon卡的數據庫,我想查詢一下查找每種類型HP數量最多的寵物小精靈。我希望視圖只顯示該寵物小精靈的名稱,類型和HP。查詢使用HP返回寵物小精靈的類型

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

我有這段代碼。它返回最大HP但不是正確的寵物小精靈。 此代碼是否會顯示單個類型具有相同HP的多行?

回答

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的所有口袋妖怪的名字。

+0

這很好用。顯然,我需要熟悉自己的加入。 Thx –

+0

@RobertBain - 這是我的榮幸。別客氣。 –

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 

這將在每個具有最大的健康

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多行的單一類型。

BTW在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

'Type'分區具有與同樣的效果group by

優點是你不需要加入表本身,你可以選擇你在選擇想要的任何列。包括像Id這樣的列,這在組中是不可能的。 (組中的Id意味着每個記錄在結果中都有自己的行,如果Id是唯一的話)