2013-07-31 3 views
0

В моей таблице у меня есть список имен, адресов электронной почты и столбца с именем referrer. Имя пользователя и адрес электронной почты несколько раз вводятся в таблицу для конкурса. В колонке рефералов рассказывается, как участник узнал о конкурсе.Многослойная фильтрация MySQL на основе критериев из одного столбца

Как получить набор записей участников, который показывает, является ли реферер web и/или email, но выбрать только одну запись для каждого? Например, участник может быть введен 10 раз под email и 100 раз под web. То, что я пытаюсь сделать, это получить только один экземпляр каждой записи.

Это мой текущий запрос:

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

Конечно, когда я использую GROUP BY это только дает мне один экземпляр записи, независимо от нашел ли он иметь email или web.

Удаление GROUP BY даст мне все экземпляры, которые много ...

Как написать запрос, чтобы дать мне одну запись каждого участника, который имеет как email и web?

ответ

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

Так что, если вам нужно отчетливые (имя, адрес электронной почты) пар и один происхождения без предпочтений, следующий запрос будет работать с MySQL:

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

См http://sqlfiddle.com/#!2/85292/5 для сравнения;

0

Просто используйте DISTINCT ...

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

В отсутствие каких-либо агрегационных функций использование предложения GROUP BY просто неуместно. – Strawberry

+0

@Strawberry в «обычном стандарте SQL» вы правы: неагрегатный столбец, не содержащий ссылок в предложении group by, не допускается в предложении select. Но MySQL явно принимает это как расширение. Значение в одном из значений в группе по усмотрению сервера. –

Смежные вопросы