2013-05-31 23 views
0

的我有以下查詢:SQL:追加有兩個相同的查詢「GROUP BY ORDER BY」和相同數量的行

SELECT q2.name, q1.countParticipants, q2.countGames FROM 
(
    SELECT c.countryName AS name, count(p.idParticipant) AS countParticipants 
    FROM Country c, Participant p, Game g 
    WHERE p.fkGame = g.idGame AND c.idCountry = p.fkCOuntry AND c.countryName LIKE '%$countryName%' 
    GROUP BY c.countryName 
    ORDER BY c.countryName; 
) AS q1 , 
(
    SELECT c.countryName AS name, count(g.idGame) as countGames 
    FROM Country c, Game g 
    WHERE c.idCountry = g.fkHostCountry AND c.countryName LIKE '%$countryName%' GROUP BY c.countryName 
    ORDER BY c.countryName) 
) AS q2 
GROUP BY q1.name 
ORDER BY q1.name 

查詢應該在奧運會上那把返回參與者的數量在給定的countryName(q1)中以及在相同的countryName(q2)中發生的總數比賽的次數。它確實會返回一些東西,但結果是錯誤的。

,而不是返回什麼,我需要(即數的遊戲),似乎回到遊戲,在countParticipantsparticipants參加了數(特定國家)。

現在,無論是從我的查詢中,問題都來自我的數據庫中的數據。你可以請檢查一下,所以我知道在哪裏糾正這個問題?

非常感謝您

注意:兩者的結果集加時賽的子查詢返回相同的行數和排序方式相同。

+0

你知道'GROUP BY'是做什麼的嗎? – Kermit

+0

是的,我知道它做了什麼。我有更多的中級SQL級別:) –

+0

你需要一個聚合來使用它。 – Kermit

回答

1

爲此,您可以使用一個查詢和使用COUNT(DISTINCT

SELECT c.countryName AS name, 
     COUNT(p.idParticipant) AS countParticipants , 
     COUNT(DISTINCT g.idGame) AS CountGames 
FROM Country c 
     INNER JOIN Participant p 
      ON c.idCountry = p.fkCOuntry 
     INNER JOIN Game g 
      ON p.fkGame = g.idGame 
WHERE c.countryName LIKE '%$countryName%' 
GROUP BY c.countryName 
ORDER BY c.countryName; 

如果你想知道爲什麼我已經改變了你的隱ANSI 89聯接,以明確的ANSI 92聯接給this article讀。雖然ANSI 89連接沒有錯誤,並且通常會創建相同的執行計劃,但我相信使用它們的原因不會因爲不使用它們而被權衡。

+0

不錯!謝謝:)我不知道關於連接的技巧。這篇文章似乎也很有趣 –