2016-01-29 5 views
0

У меня есть таблица, как следующие, который только сказать, что человек соответствует кого-то на одной и те же команды (включая себя):Как SQL группы, на основе общего членства

person1|person2 
------------- 
A  | A 
B  | A 
C  | A 
A  | B 
B  | B 
C  | B 
A  | C 
B  | C 
C  | C 
X  | X 
Y  | X 
X  | Y 
Y  | Y 

Я хотел бы иметь две записи с использованием GROUP_CONCAT и имеют следующие

team 
------- 
A, B, C 
X, Y 

порядок GROUP_CONCAT не так уж важно, но я не хочу, повторы, как «A, B, C», «B, A, C». Или еще лучше бы довольствоваться только любого рода TeamID вместе с членом:

teamid|person 
------------- 
1  | A 
1  | B 
1  | C 
2  | X 
2  | Y 

ответ

1

Учитывая ваши данные, вы можете справиться с этим, выполнив:

select distinct group_concat(person2 order by person2) 
from t 
group by person1; 

Как примечание: вы можете поменять person2 и person1 и получите те же результаты.

+0

Спасибо, что прекрасно работает. Я думаю, что «порядок по причине» не нужен, так как он отлично работает без него. (SQLite не поддерживает его) – swdev

+0

@swdev В этом конкретном случае он работает, но только потому, что строки читаются в правильном порядке. ORDER BY по-прежнему требуется. –

+0

@CL. , , Ответ на этот вопрос не был отмечен SQLite. –

1

Используйте команду group_concat(), чтобы сгенерировать список членов команды. Чтобы гарантировать, что group_concat() создает только один уникальный результат для каждого возможного набора членов команды, сортировать данные первыми:

SELECT DISTINCT group_concat(person2) 
FROM (SELECT person1, person2 
     FROM MyTable 
     ORDER BY person1, person2) 
GROUP BY person1; 
Смежные вопросы