0

在我的表格中,我有一个姓名列表、电子邮件地址和一个名为referrer 的列。用户名和电子邮件被多次输入到比赛表中。推荐人栏告诉我参赛者是如何得知比赛的。

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

这是我当前的查询:

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

当然,当我使用GROUP BY它时,它只会给我一个记录实例,而不管它是否被发现有emailweb.

删除GROUP BY将给我所有的实例,这是很多......

我如何编写查询以给我一个同时具有email和的参赛者的记录web

4

2 回答 2

0

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

如果您只需要不同的(名称,电子邮件)对而不管引荐来源,请使用DISTINCT关键字:

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

如果您需要不同的 (name, email, referrer) 元组,则适用相同的解决方案:

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

因此,如果您需要不同的 (name, email) 对和一个没有偏好的来源,则以下查询将适用于 MySQL

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

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

于 2013-07-31T17:15:43.403 回答
0

只需使用 DISTINCT ...

select distinct(referrer) as user from table_contestants 
where referrer IN ('email', 'web') GROUP BY email order by referrer;
于 2013-07-31T16:33:23.877 回答