1

タイトルは少し複雑です。これが具体的な例です。私は2つのテーブルを持っています:

+-------------+--------------------------------+------+-----+---------+-------+
| Field       | Type                           | Null | Key | Default | Extra |
+-------------+--------------------------------+------+-----+---------+-------+
| event       | varchar(100)                   | NO   | MUL | NULL    |       |
| sport       | varchar(100)                   | NO   |     | NULL    |       |
| athleteCode | char(10)                       | NO   | MUL | NULL    |       |
| medal       | enum('GOLD','SILVER','BRONZE') | NO   |     | NULL    |       |
+-------------+--------------------------------+------+-----+---------+-------+

+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(100) | NO   |     | NULL    |       |
| code    | char(10)     | NO   | PRI | NULL    |       |
| country | varchar(100) | NO   | MUL | NULL    |       |
+---------+--------------+------+-----+---------+-------+

最初のテーブルはメダル テーブルです。2 番目のテーブルはアスリート テーブルです。2 つのテーブルは、 と を介して関連付けmedals.athleteCodeられていathlete.codeます。次の情報を表示するクエリを一覧表示できるようにしたいと考えています。

COUNTRY | GOLD | SILVER | BRONZE | TOTAL

これまでに実行できた唯一の方法は、次のクエリを使用することです。

SELECT country, medal, COUNT(medal) as count  
    FROM athletes, medals  
    WHERE athletes.code=medals.athleteCode  
    GROUP BY country, medal  
    ORDER BY country, medal;

しかし、このクエリを実行した後も、(PHP を介して) クエリを処理する必要があります。これは、メダルの種類ごとにすべての国を取得するためです (つまり、中国のすべての金、すべての中国の銀、すべての中国の銅など)。クエリの各レコード (行) が次のようなクエリを作成する方法はありますCOUNTRY | GOLDS | SILVERS | BRONZES | TOTALか? 見ましCOUNT()たが、使い方がよくわかりません。


2012.08.17

@「habib zare」の解決策は本当に近いです。これが私の微調整です:

SELECT country, 
(SELECT count(*) FROM medals WHERE a.code=m.athleteCode AND medal='Gold') AS Gold,
(SELECT count(*) FROM medals WHERE a.code=m.athleteCode AND medal='Silver') AS Silver,
(SELECT count(*) FROM medals WHERE a.code=m.athleteCode AND medal='Bronze') AS Bronze,
(SELECT count(*) FROM medals WHERE a.code=m.athleteCode) AS Total
FROM medals m JOIN athletes a
ON m.athleteCode=a.code
GROUP BY country
ORDER BY country, Gold DESC, Silver DESC, Bronze DESC

問題は、二次SELECTステートメントが国に基づいて選択する必要があることです。つまり、次のようなものが必要です:

SELECT country AS Country,
(SELECT count(*) FROM medals WHERE a.code=m.athleteCode AND medal='Gold' AND a.country=Country) AS Gold,
4

3 に答える 3

0

私はあなたが何を望んでいるのか理解していませんが、私はあなたがこれを望んでいると思います:

メダル:メダルイベントスポーツアスリートコードゴールドjhスイム1

ブロンズdfgert2

ゴールドfgerr1

erf4としてのシルバー

erf5としてのブロンズ

ゴールドdfdfg6

ゴールドsddsテコンドー3

ブロンズdfjh1

ブロンズyyjh1

1としてのシルバーik

シルバーshjjsg3

シルバーshjjsg5

シルバーsjdkhgj5

シルバーwuytuwopow5

シルバーwuytuwopow6

シルバーwuytuwopow6

アスリート:

ネームコード国

habib1イラン

ahmad2アゼルバイジャン

mehmad3ターキー

だから4イラン

ghg5アゼルバイジャン

yewtuuy6アゼルバイジャン

私の質問:

SELECT country,name,
(select count(*) from medals where athleteCode=m.athleteCode and medal='Gold') as Gold,
(select count(*) from medals where athleteCode=m.athleteCode and medal='Silver') as Silver,
(select count(*) from medals where athleteCode=m.athleteCode and medal='Bronze') as Bronze,
(select count(*) from medals where athleteCode=m.athleteCode) as Total
FROM medals m join athletes a
on m.athleteCode=a.code
group by country,code
order by country,Gold desc,Silver desc,Bronze desc

結果 :

国名ゴールドシルバーブロンズトータル

アゼルバイジャンyewtuuy12 0 3

アゼルバイジャンghg03 1 4

アゼルバイジャンahmad00 1 1

イランハビブ212 5

イランそう010 1

七面鳥メフマド110 2

于 2012-08-17T16:07:36.577 に答える
0

MS SQL Server ではSUM(CASE WHEN medal = 'GOLD' THEN 1 ELSE 0 END) AS GOLDSで使用できますGROUP BY country

于 2012-08-17T04:09:58.717 に答える
0

MSSQL を使用している場合は、OUTER APPLY も使用できます。

サンプル:

SELECT Country
  ,Gold = ISNULL(GoldMedals.MedalCount,0)
  ,Total = ISNULL(TotalMedals.MedalCount,0) 
FROM athletes
  OUTER APPLY (
     SELECT MedalCount = COUNT(*)
     FROM medals
     WHERE medals.athletescode = atheletes.medalsathleteCode
       AND medals.Type = 'Gold'
   ) GoldMedals
   OUTER APPLY (
     SELECT MedalCount = COUNT(*)
     FROM medals
     WHERE medals.athletescode = atheletes.medalsathleteCode
    ) TotalMedals   
GROUP BY country

おそらく ISNULL の代わりに SUM を追加する必要がありますが、このコードを実際にテストしていないので、そのまま使用してください...

于 2012-08-17T04:16:27.720 に答える