我管理一个注册系统,人们可以注册课程,我有以下查询来计算一些统计数据:
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 :(得分: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
子句。