タイトルは少し複雑です。これが具体的な例です。私は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,