2013-12-19 43 views
0

我新的SQL,我需要一些幫助,這任務:簡單的SQL查詢與MAX()

數據庫模式:

Comic(no primary key NOT NULL, title, pages, publisher) 
PoweredPerson(alias primary key NOT NULL, firstname NOT NULL, lastname, evilness_level) 
SuperHero(alias primary key→PoweredPerson NOT NULL,cape) 
SuperVillain(alias primary key→PoweredPerson NOT NULL) 
FightIn(comic primary key→ Comic NOT NULL,hero primary key→ SuperHero NOT NULL,villain primary key→ SuperVillain NOT NULL) 

現在我必須聲明的SQL查詢它給人的第一以及那些在只有一部漫畫中與最強敵作戰的動力人物的姓氏。

我的解決辦法是這樣的:

SELECT firstname,lastname 
FROM fightIn f 
JOIN poweredperson p 
ON f.hero = p.alias OR f.villain= p.alias 
GROUP BY comic,alias 
HAVING COUNT(alias)=(SELECT COUNT(alias) 
        FROM fightIn f 
        JOIN poweredperson p 
        ON f.hero = p.alias OR f.villain = p.alias 
        GROUP BY comic,alias 
        ORDER BY COUNT(hero) DESC 
        LIMIT 1) 

我想知道如果我的解決方案是正確的,如果它是,是否有解決這個問題一個更聰明和更短的方式。

在此先感謝=)

回答

1

既然「p.alias」是一樣的「f.hero」,爲什麼加入得到計數。另外,由於您返回的限制爲1,爲什麼不包含計數的別名,因此您已經擁有該計數。做到一切,做好。另外,作爲SQL的新手,應該習慣於使用「table.column」或「tableAlias.column」來防止未來列更復雜的列出現歧義。

SELECT 
     p.firstname, 
     p.lastname, 
     MostFights.hero, 
     MostFights.Comic, 
     MostFights.FightsInComic 
    from 
     (SELECT 
       f.Comic, 
       f.hero, 
       COUNT(*) as FightsInComic 
      from 
       fightIn f 
       left join SuperVillain sv 
        on f.hero = sv.alias 
      where 
       sv.alias IS NULL 
      group by 
       f.Comic, 
       f.hero 
      order by 
       COUNT(*) desc 
      limit 1) MostFights 
     JOIN PoweredPerson p 
     ON MostFights.hero = p.alias 
+0

首先感謝您的幫助。但是我在您的解決方案中看到一個問題。也有可能,在一部漫畫中戰鬥最多的動力員是超級大人。如果不加入與poweredPerson的戰鬥,我不知道如何將其納入查詢。 – user3117357

+0

@ user3117357,修改爲排除超級villians ... – DRapp