2013-10-08 6 views
5

У меня есть TB1 таблицу, как это:MySQL GROUP_CONCAT и DISTINCT

name email    link 
john [email protected] google 
john [email protected] facebook 
john [email protected] twitter 
.... 
.... 
and more 

Когда я называю данные с запросом выглядит

SELECT name, email, group_concat(DISTINCT link SEPARATOR '/') as source 
FROM tb1 
group by email 

И результат:

NAME EMAIL    SOURCE 
john [email protected] twitter 
john [email protected] facebook/google 
.... 
.... 
and more 

sqlfiddle

Я хочу, чтобы результат выглядел так:

NAME EMAIL    SOURCE 1  SOURCE 2 
john [email protected] twitter 
john [email protected] facebook  google 

Возможно сделать результат только с запросом?

Примечание: Я не хочу, чтобы сделать динамический источник колонки 1, 2, 3 ...., п

+0

Это сводная таблица вариантов (теоретически, Source 1, Source 2 .... может продолжить Source X на основе X числа различных исходных значений, правильно?) Если это так, вам следует искать «тупическую таблицу mysql», , есть некоторые большие (хотя и нетривиальные) статьи – AgRizzo

+0

возможный дубликат [MySQL сводной таблицы] (http: // stackoverflow.com/questions/7674786/mysql-pivot-table) – ModulusJoe

+0

спасибо @AgRizzo для ссылки, я буду читать о таблице mysql pivot. Этот вопрос может иметь место. Я обновлю свой вопрос, когда я застрял с таблицей сводки mysql. – itx

ответ

1

Нет вы не можете, так как с MySQL вы можете не создавать динамически дополнительный столбец ... (это более материал olap или позволяющий использовать такую ​​функциональность под названием сводная таблица)

+1

он никогда не упоминал динамический – AdrianBR

+0

@AdrianBR, если он не динамический, тогда мой ответ может работать, но об этом нужно проверить. –

1

Он может работать для этого случая, но не является динамическим запросом и может работать только в том случае, если для одного и того же адреса электронной почты имеется максимум 2 ссылки.

SELECT `name`, email, 
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',1) as source_1, 
if(group_concat(DISTINCT link SEPARATOR '/') like '%/%', 
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',-1),'') as source_2 
FROM test2 group by email 

Если вы знаете точное количество ссылок на электронную почту, то один и тот же запрос может быть соответствующим образом изменен.

+1

будет работать нормально, умное использование если. – AdrianBR

2

Мой ответ: не делайте этого!

Что вы хотите сделать, называется поворот. В MySQL это обычно делается с одним адом

.... 
aggregate_function(case when ...), 
aggregate_function(case when ...), 
aggregate_function(case when ...), 
... 

блок. Но поскольку вы не знаете всех своих источников, вам придется написать процедуру для динамического создания инструкции для вас и ее выполнения. И даже тогда вы в конечном итоге со структурой таблицы, как

NAME EMAIL    twitter  facebook google 
---------------------------------------------------------- 
john [email protected] yes   no   no 
john [email protected] no   yes   yes 

Итак, как бы программисты приложения знают, как столбцы названы?

Чтобы избежать этого, вам нужно будет сделать еще один адский код в вашей хранимой процедуре, чтобы поместить значения строк каждого письма в один столбец. Тогда как бы вы определили, какая строка попадает в какой столбец? Что делать, если facebook появляется в одной строке в столбце source1 и в другой строке в столбце source2? И в вашем приложении вам придется протестировать или иным образом определить, сколько столбцов есть на самом деле, или каждый пользователь/адрес электронной почты имеет только 2 источника?

Подводя вещи, как результат этого

name email    link 
john [email protected] google 
john [email protected] facebook 
john [email protected] twitter 

это прекрасно, и это до разработчиков приложений, чтобы справиться с ней. И гораздо проще сделать это для них, чем для парня базы данных в вашей команде.

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