SQL是否可以组合group,count和distinct?

时间:2013-05-16 09:40:53

标签: mysql

我管理一个注册系统,人们可以注册课程,我有以下查询来计算一些统计数据:

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做一些事情来实现这一点。但无论我尝试什么,它要么给我非常奇怪的结果或错误。

可以这样做吗?

3 个答案:

答案 0 :(得分:0)

如何在表格上添加UNIQUE约束?

ALTER TABLE participants ADD CONSTRAINT part_uq UNIQUE (email)

答案 1 :(得分:0)

尽量不要在查询中混合使用distinct和group by。你得到的结果相同:

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。

答案 2 :(得分: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子句。