0

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

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

是否有可能做到这一点 ?

4

3 回答 3

0

UNIQUE在表上添加约束怎么样?

ALTER TABLE participants ADD CONSTRAINT part_uq UNIQUE (email)
于 2013-05-16T09:45:18.037 回答
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。

于 2013-05-16T09:53:24.080 回答
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

于 2013-05-16T09:53:45.437 回答