2011-10-31 9 views
0

私の質問は確かに辛いですが、私はスポーツイベントサマリーテーブルの上位3カ国のリストを作成できるSQLクエリを設定できません。 私はもっと良く説明します:スポーツイベントでは、私はさまざまな国の選手がたくさんいます。より多くのメダルを獲得した国を示すサマリーテーブルを作成する必要があります。ここで は一例です:トップ3国

-------------------------------------------- 
|id |  name | activity | country | 
-------------------------------------------- 
| 1 | John  | 100m  | USA  | 
| 2 | Andy  | 200m  | CANADA | 
| 3 | Frank  | 400m  | USA  | 
| 4 | Ian  | 400m  | GERMANY | 
| 5 | Anthony | 100m  | USA  | 
| 6 | Eric  | 400m  | CANADA | 
| 7 | Mike  | 200m  | UK  | 
| 8 | Dave  | 200m  | GERMANY | 
| 9 | Richard | 100m  | USA  | 
| 10| Max  | 100m  | USA  | 
| 11| Randy  | 100m  | USA  | 
| 12| Maurice | 400m  | CANADA | 
| 13| Col  | 100m  | UK  | 
| 14| Jim  | 400m  | USA  | 
| 15| Adam  | 200m  | BRAZIL | 
| 16| Ricky  | 100m  | UK  | 
| 17| Emily  | 400m  | USA  | 
| 18| Serge  | 200m  | UK  | 
| 19| Alex  | 400m  | FRANCE | 
| 20| Enamuel | 100m  | USA  | 
-------------------------------------------- 

私が取得したいサマリー表は以下の通りです:

トップ3カ国

-------------------------------------- 
| position | country | medals | 
-------------------------------------- 
|  1 |  USA  | 9 | 
|  2 |  UK  | 4 | 
|  3 |  CANADA | 3 | 
-------------------------------------- 

方法QSLクエリを構築することができますか? あなたの親切な答えをお寄せいただきありがとうございます。

マットウ

答えて

2

位置欄がないと、これは非常に簡単です。次

SELECT Country,COUNT(*) AS medals 
FROM MyTable 
GROUP BY Country 
ORDER BY COUNT(*) DESC 
LIMIT 3; 

を行うだけで、「位置」欄を取得するためのいくつかのより複雑なコードがありますが、あなたがそれを必要としない限り、それはおそらく必要はなく、あなただけのこれらの数字は上のカウンターを使用して得ることができます処理コード。あなたが興味を持っているなら、コードはこのようなものになります。

SELECT @rownum:[email protected]+1 AS Position,Country,Medals FROM 
(
SELECT Country,COUNT(*) AS medals 
FROM Medals 
GROUP BY Country 
ORDER BY COUNT(*) DESC 
LIMIT 3 
) AS Stats, (SELECT @rownum:=0) RowNum; 

上記のクエリはテストされており、必要に応じて機能しているようです。

+1

はい、位置欄がなくても簡単です... – Thilo

+1

結果から別の(サマリー)テーブルを作成する方法を尋ねています。ピース・オブ・ケーキ - その結果を自動インクリメント・フィールド(位置)を持つ新しいテーブルに挿入します。 –

0

あなたの代わりにあなたのプログラムのロジックでそれを追加することができればそれは、ランクなしではるかに簡単です:Kibbeeもそれを私を打つよう

SELECT `country`, COUNT(*) total 
FROM medal 
GROUP BY country 
ORDER BY total DESC 
LIMIT 3 

は見えるが、保証GROUP BY互換性のあるクエリのために、あなたは上記をラップすることができます独自ののSELECT

SELECT @n:[email protected]+1 AS rank, country, total 
FROM 
    (
    SELECT `country`, COUNT(*) total 
    FROM medal 
    GROUP BY country 
    ORDER BY total DESC 
    LIMIT 3 
) t1, 

(SELECT @n:=0) t2 
1
CREATE TABLE IF NOT EXISTS top_three_countries 
    (position INT NOT NULL AUTO_INCREMENT, country VARCHAR(30), medals INT); 
TRUNCATE TABLE top_three_countries; 
INSERT INTO top_three_countries (country, medals) 
    SELECT country, count(*) total 
    FROM medal 
    GROUP BY country 
    ORDER BY total DESC 
    LIMIT 3; 

あなたが説明するようにこれは集計表(top_three_countries)を生成します。

関連する問題