2012-03-31 2 views
1

Это моя структура таблицыПроверьте, существует группа MySQL Query

группировки

id groupName 
1 group1 
2 group2 
3 group3 
4 andSoOn 

group_members (правильный)

groupingId accountId groupLeader 
1   5001  5001 
1   5002  5001  
2   5001  5001 
2   5002  5001 
2   5003  5001 
3   5001  5001 
3   5002  5001 
3   5003  5001 
3   5004  5001 

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

, например:

group_members (неправильно)

groupingId accountId groupLeader 
1   5001  5001 
1   5002  5001  
2   5001  5001 
2   5002  5001 
2   5003  5001 
3   5001  5001 
3   5002  5001 
3   5003  5001 

в заявлении вставки с groupingId = потерпит неудачу, потому что 5001,5002,5003 уже существует groupingId =

что hould мой оператор выбора, чтобы проверить, если члены уже существует в группе ... Кстати, им с помощью PHP для этого

+0

Какая вставка не удалась? –

+1

он не работает, если вы вставляете 5001,5002,5003, поскольку он уже существует при группировке. = ** 2 ** – rjmcb

+0

Вы хотите, чтобы вы всегда проверяли, когда вы добавляете учетную запись в группу, если есть другая группа с одинаковыми учетными записями ? Когда есть один, вы не хотите, чтобы учетная запись была вставлена. – riv333

ответ

2

Вам нужно что-то вроде этого

SELECT groupingId, COUNT(*) AS accounts_present 
FROM group_members 
WHERE accountId IN (5001,5002,5003) 
GROUP BY groupingId 
HAVING accounts_present=3 // 3 here is the number of accounts in the "group", i.e. in the IN clause 

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

1

Этот запрос дает уникальную строку для каждой другой группы

SELECT GROUP_CONCAT(CONCAT(accountId, ',', groupLeader) SEPARATOR '|') FROM group_members GROUP BY groupingId; 

Так что это будет дать вам количество различных групп

SELECT count(*) FROM (SELECT DISTINCT GROUP_CONCAT(CONCAT(accountId, ',', groupLeader) SEPARATOR '|') AS unique_string FROM group_members GROUP BY groupingId) AS tmp_table; 

Теперь вам нужно сравнить его с количеством групп.

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