1

私のデータベース プロジェクトでは、オリンピックのデータに関するデータベースを構築する必要がありました。

次のクエリも作成する必要があります。

ユーザーが提供する特定のオリンピックのメダル テーブルを計算します。メダル テーブルには、国の IOC コードに続いて、金、銀、銅、合計メダル数が含まれている必要があります。最初にゴールド、次にシルバー、最後にブロンズの数でソートする必要があります。

基本的に、Medalsオリンピックの試合で一部の参加者が獲得したメダルを含むテーブルがあります。

colorメダルは、私のテーブルのフィールドに「金メダル」「銀メダル」「銅メダル」のように保管されますMedals

次のクエリを使用しようとしました:

SELECT q1.country, q1.name as "Game", q1.cntG, q2.cntS, q3.cntB FROM
(
    SELECT c.countryName as country, g.name as name, count(m.idMedal) as cntG 
    FROM Game g
    INNER JOIN Participant p
    ON p.fkGame = g.idGame
    INNER JOIN Country c
    ON p.fkCountry = c.idCountry
    INNER JOIN Medals m
    ON m.fkMedalist = p.idParticipant
    WHERE
    g.name = "2012 Summer Olympics" 
    AND m.color like '%Gold%'
    GROUP BY c.countryName
    ORDER BY c.countryName, cntG DESC
) as q1,
(
    SELECT c.countryName as country, g.name as name, count(m.idMedal) as cntS 
    FROM Game g
    INNER JOIN Participant p
    ON p.fkGame = g.idGame
    INNER JOIN Country c
    ON p.fkCountry = c.idCountry
    INNER JOIN Medals m
    ON m.fkMedalist = p.idParticipant
    WHERE g.name = "2012 Summer Olympics" 
    AND m.color like '%Silver%'
    GROUP BY c.countryName
    ORDER BY c.countryName, cntS DESC
) as q2,
(
    SELECT c.countryName as country, g.name as name, count(m.idMedal) as cntB 
    FROM Game g
    INNER JOIN Participant p
    ON p.fkGame = g.idGame
    INNER JOIN Country c
    ON p.fkCountry = c.idCountry
    INNER JOIN Medals m
    ON m.fkMedalist = p.idParticipant
    WHERE g.name = "2012 Summer Olympics" 
    AND m.color like '%Bronze%'
    GROUP BY c.countryName
    ORDER BY c.countryName, cntB DESC
) as q3
GROUP BY q1.country
ORDER BY q1.cntG, q2.cntS, q3.cntB DESC

まあ、それは私にまったく奇妙な結果をもたらします。このクエリに何か問題があることはわかっていますが、それが何であるかを理解できません!

あなたが私を助けてくれることを願っています:)

ありがとう

注: 現時点では、クエリの総数 (割り当てで求められている) を無視しました。最初の部分を構築することを考え出したら、全体を試してみます

4

3 に答える 3

3

データは問題ではありません.q1、q2、q3のそれぞれの間に暗黙のデカルト結合があるという事実が問題です。試す:

SELECT c.countryName as country, 
       count(case m.idMedal when 'Gold medal' then 1 end) as cntG,
       count(case m.idMedal when 'Silver medal' then 1 end) as cntS,
       count(case m.idMedal when 'Bronze medal' then 1 end) as cntB
FROM Game g
INNER JOIN Participant p ON p.fkGame = g.idGame
INNER JOIN Country c ON p.fkCountry = c.idCountry
INNER JOIN Medals m ON m.fkMedalist = p.idParticipant
WHERE g.name = "2012 Summer Olympics" 
GROUP BY c.countryName
ORDER BY cntG DESC, cntS DESC, cntB DESC
于 2013-06-02T19:54:04.997 に答える
2

申し訳ありませんが、あなたのクエリは本当に混乱しています。そのように 3 つのサブクエリを単純に結合することはできません。

ただし、1 つのクエリで必要なものを取得できます。擬似コードを提供し、詳細を残します:)

SELECT
    [countryName],
    SUM(color like '%Gold%') as total_gold,
    SUM(color like '%Silver%') as total_silver,
    SUM(color like '%Bronze%') as total_bronze,
    COUNT(*) as total
FROM Medals
INNER JOIN Participant (...)
INNER JOIN Country (...)
INNER JOIN Game (...)
WHERE (...)
GROUP BY [countryName]
ORDER BY total_gold DESC, total_silver DESC, total_bronze DESC;
于 2013-06-02T19:52:46.180 に答える
1

クエリを修正または改善する方法はたくさんありますが、そのうちの 1 つは追加です。

 ...
 WHERE q1.country = q2.country 
   AND q1.country = q3.country

(直前GROUP BY q1.country)。

別の解決策は、 JOIN q1, q2 および q3 ONcountryです。

于 2013-06-02T19:55:59.333 に答える