我有2個表:優化MySQL查詢:獎牌榜
olympic_medalists與列gold_country,silver_country,bronze_country
標誌與國家列
我要列出奧運獎牌表相應。我有這個查詢,它的工作原理,但它似乎殺死MySQL。希望有人可以幫助我優化查詢。
SELECT DISTINCT country AS sc,
IFNULL(
(SELECT COUNT(silver_country)
FROM olympic_medalists
WHERE silver_country = sc AND silver_country != ''
GROUP BY silver_country),0) AS silver_medals,
IFNULL(
(SELECT COUNT(gold_country)
FROM olympic_medalists
WHERE gold_country = sc AND gold_country != ''
GROUP BY gold_country),0) AS gold_medals,
IFNULL(
(SELECT COUNT(bronze_country)
FROM olympic_medalists
WHERE bronze_country = sc AND bronze_country != ''
GROUP BY bronze_country),0) AS bronze_medals
FROM olympic_medalists, flags
GROUP BY country, gold_medals, silver_country, bronze_medals HAVING (
silver_medals >= 1 || gold_medals >= 1 || bronze_medals >= 1)
ORDER BY gold_medals DESC, silver_medals DESC, bronze_medals DESC,
SUM(gold_medals+silver_medals+bronze_medals)
結果會是這樣的:
country | g | s | b | tot
---------------------------------
country1 | 9 | 5 | 2 | 16
country2 | 5 | 5 | 5 | 15
等
謝謝!
olympic medalists:
`id` int(8) NOT NULL auto_increment,
`gold_country` varchar(64) collate utf8_unicode_ci default NULL,
`silver_country` varchar(64) collate utf8_unicode_ci default NULL,
`bronze_country` varchar(64) collate utf8_unicode_ci default NULL, PRIMARY KEY (`id`)
flags
`id` int(11) NOT NULL auto_increment,
`country` varchar(128) default NULL,
PRIMARY KEY (`id`)
你可以發佈您的架構?我也不太清楚你的意思是通過殺死mysql嗎? – 2012-08-04 05:53:36
'殺死mysql' - 當我運行這個時,頁面加載需要一段時間,並且在本地服務器上。當我在運行的服務器上運行它時,基本上需要永久加載和mysql死掉。我會將模式添加到後 – 2012-08-04 05:59:08
抱歉問這個問題,但是有可能修改您的模式嗎?我假設標誌中的varchar是國家代碼或國家代碼,奧運獎牌獲得者在干涉類別中會重複這一點。如果不重複,IT部門可能會稍微乾淨一些,以便更新/插入記錄。也許將國旗改爲國家,併爲黃金,白銀和銅牌製作連接表,並在其中放置諸如國家ID,事件,動作名稱等的具體信息(遺憾地建議更改您的架構,我知道它並不總是可行的),這會使事情變得更簡單但從長遠來看。這些指標也會有所幫助。 – 2012-08-04 06:22:30