在我的表中,我有一个名单,电子邮件地址列表和一个名为referrer的列。用户名和电子邮件会多次输入到竞赛表中。推荐人专栏告诉我参赛者如何听到比赛。
如何获得参赛者的记录集,以显示引荐来源是web
和/或email
,但只为每个参赛者选择一条记录?例如,参赛者可以在email
下输入10次,在web
下输入100次。我想要做的只是获取每个记录的一个实例。
这是我目前的查询:
select * from table_contestants
where referrer IN ('email', 'web') GROUP BY email order by referrer;
当然,当我使用GROUP BY
时,它只会给我一个记录实例,无论它是否有email
或web
。
删除GROUP BY
将为我提供所有实例,这很多......
如何编写查询,以便为每位同时包含email
和web
的参赛者提供一条记录?
答案 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进行比较;