2013-05-16 60 views
0

我管理登記制度,人們可以在那裏爲一療程註冊,和我有以下查詢計算的一些統計數據:SQL是否可以將組合,計數和區分?

SELECT p.id_country AS id, c.name, COUNT(p.id_country) AS total 
       FROM participants p 
      LEFT JOIN countries c ON p.id_country = c.id 
      WHERE p.id_status NOT IN (3,4,13,14) 
      GROUP BY p.id_country 
      ORDER BY total DESC 

此查詢工作正常,那就說明我到底每個國家參加的人數。 現在我們的系統可以註冊多個課程,並且每次註冊時都會在參與者表中插入一個新行。我知道,這不是理想的情況下,只可惜爲時已晚,現在要改變這種權利。如果參與者註冊了第二(或第三,第四等)課程,則他使用相同的電子郵件地址。所以在參與者表中,同一個電子郵件地址可以在那裏多次。

什麼,我想要做的就是改變這個查詢,以便它考慮到了每一個電子郵件地址只能使用一次的帳戶。該字段只是p.email,我想我應該用DISTINCT做些事情來實現這一點。但無論我嘗試什麼,它都會給我帶來非常奇怪的結果或錯誤。

是否可以這樣做?

回答

0

儘量不要在查詢中混合使用不同的分組。你得到相同的結果做:

select distinct p.id_country from participants 

比做

select p.id_country from participants group by p.id_country 

你需要的是過濾掉重複:

SELECT p.id_country AS id, c.name, COUNT(p.id_country) AS total 
      FROM participants p 
     LEFT JOIN countries c ON p.id_country = c.id 
     WHERE p.id_status NOT IN (3,4,13,14) 
       and not exists 
      (select email from participants p2 where p1.email=p2.email and p1.id>p2.id) 
     GROUP BY p.id_country 
     ORDER BY total DESC 

這隻會算電子郵件一次,由不計算具有重複電子郵件的新帳戶的IDS。

+0

這似乎這樣的伎倆,謝謝:) –

0

如何在表上添加UNIQUE約束?

ALTER TABLE participants ADD CONSTRAINT part_uq UNIQUE (email) 
+0

的事情是,電子郵件是不是唯一的,它應該完全有可能使用相同的電子郵件不止一次 –

0
SELECT 
    p.id_country AS id, 
    c.name, 
    COUNT(p.id_country) AS total 
FROM 
    (select p.mail, max(id_country) as id_country from participants where p.id_status not in (3,4,13,14) group by p.mail) p 
    LEFT JOIN countries c ON p.id_country = c.id 
GROUP BY 
    p.id_country 
ORDER BY 
    total DESC 

對於一個電子郵件地址有更多國家的情況,我使用max(id_country)。如果無法通過設計發生,你可以移動到id_country條款group by

+0

感謝,我和Alex的解決方案去,這似乎工作以及雖然:) –