基于一列标准的MySQL多层过滤

时间:2013-07-31 16:01:32

标签: mysql

在我的表中,我有一个名单,电子邮件地址列表和一个名为referrer的列。用户名和电子邮件会多次输入到竞赛表中。推荐人专栏告诉我参赛者如何听到比赛。

如何获得参赛者的记录集,以显示引荐来源是web和/或email,但只为每个参赛者选择一条记录?例如,参赛者可以在email下输入10次,在web下输入100次。我想要做的只是获取每个记录的一个实例。

这是我目前的查询:

select * from table_contestants 
where referrer IN ('email', 'web') GROUP BY email order by referrer;

当然,当我使用GROUP BY时,它只会给我一个记录实例,无论它是否有emailweb

删除GROUP BY将为我提供所有实例,这很多......

如何编写查询,以便为每位同时包含emailweb的参赛者提供一条记录?

2 个答案:

答案 0 :(得分:0)

只需使用DISTINCT ...

select distinct(referrer) as user from table_contestants 
where referrer IN ('email', 'web') GROUP BY email order by referrer;

答案 1 :(得分:0)

根据您的需要,有各种解决方案:

如果您只需要不同引用者的不同(姓名,电子邮件)对,请使用DISTINCT关键字:

SELECT DISTINCT name, email FROM tbl 
WHERE referer IN ("email", "web");

如果您需要不同的(名称,电子邮件,引荐来源)元组,则适用相同的解决方案:

SELECT DISTINCT name, email, referer FROM tbl 
WHERE referer IN ("email", "web");

作为SQL的扩展,MySQL允许在SELECT子句中引用GROUP BY子句中未引用的非聚合列。在这种情况下,非聚合列的值未确定(理解:“是组的值之一”和“结果是不可再现的”)。

http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

因此,如果您需要不同的(名称,电子邮件)对和一个来源而没有首选项,则以下查询将与一起使用

SELECT DISTINCT name, email, referer FROM tbl
WHERE referer IN ("email", "web")
GROUP BY name, email; 

请参阅http://sqlfiddle.com/#!2/85292/5进行比较;