我管理一个注册系统,人们可以在其中注册类(class),并且我有以下查询来计算一些统计数据:
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
这个查询工作正常,它准确地显示了每个国家/地区的参与者数量。 现在我们的系统可以注册多个类(class),并且每次注册都会在参与者表中插入一个新行。我知道,这不是理想的情况,但不幸的是现在改变这一点已经太晚了。如果参与者注册第二门(或第三门、第四门等)类(class),那么他将使用相同的电子邮件地址。因此,在参与者表中,同一个电子邮件地址可以出现多次。
我想做的是更改此查询,以便考虑到每个电子邮件地址只能使用一次。该字段只是 p.email,我认为我应该使用 DISTINCT 做一些事情来实现这一点。但无论我尝试什么,它要么给出非常奇怪的结果,要么给出错误。
可以这样做吗?
最佳答案
尽量不要在查询中混合使用不同和分组依据。您会得到相同的结果:
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。
关于mysql - SQL是否可以组合group、count和distinct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16583987/