2016-06-12 3 views
1

я должен получить членов, которые находятся на пяти различных групп, и эти группы должны иметь 5 членов каждойКак установить два условия в SQL Server?

  • Member (idMember, nameMember)
  • Group (idGroup)
  • Belongs (idMember, idGroup)

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

я сделал что-то вроде

select idMember, nameMember 
from Member m, Group g 
where idMember in (select b.idMember 
        from Belongs b) 
group by idMember, nameMember 
having (select count(*) 
     from Belongs b 
     where b.idMember = m.idMember)>5 
     and 
     (select count (*) 
     from Belongs b 
     where b.idGroup = g.idGroup /*??*/)>5 

и там я не знаю, как относиться принадлежит группе с

+1

Вы можете добавить некоторые примеры данных и ожидаемые результаты –

+0

да я собирался тогда я понял, что я должен был сделать, как у лот данные и отступы вручную это боль, есть ли более простой способ сделать это? –

+0

Никогда не используйте запятые в предложении 'from'. –

ответ

4

подход такого рода проблемы со ступеньками. Ниже получают элементы, которые находятся в пяти групп:

select b.idMember 
from belongs b -- Note: `group` is a reserved word so a bad name for a table 
group by b.idMember 
having count(*) = 5; 

Следующие получают группы, которые имеют пять членов:

select b.idGroup 
from belongs b 
group by b.idGroup 
having count(*) = 5; 

(. Интересная симметрия)

Если вы хотите, чтобы ограничить первый запрос к группам во втором, то простой способ заключается в использовании in:

select b.idMember 
from belongs b 
where b.groupId in (select g.idGroup 
        from belongs b 
        group by b.idGroup 
        having count(*) = 5 
        ) 
group by b.idMember 
having count(*) = 5; 

Когда вы имеете дело со сложными запросами, создавайте их по одному шагу за раз.

Примечание: group - очень плохое имя для таблицы, потому что это зарезервированное слово. И, если вы хотите имя таблицы, используйте JOIN, чтобы присоединиться к таблице участников, чтобы получить правильное имя.

EDIT:

Вы можете использовать join, чтобы получить столбцы из member:

select b.idMember, m.name 
from belongs b join 
    member m 
    on b.idMember = m.idMember 
where b.groupId in (select g.idGroup 
        from belongs b 
        group by b.idGroup 
        having count(*) = 5 
        ) 
group by b.idMember, m.name 
having count(*) = 5; 
+0

Спасибо большое чувак , Это было проще, чем я думал –

+0

Я попытался применить его, но я не могу выбрать столбцы из члена и делать то, что вы разместили здесь, можете ли вы мне помочь? –

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