Связывание таблиц mySQL, группа связана с другими списками участников, отображение всех участников

У меня есть база данных с group(g1) и списком members(m1), сама по себе она работает нормально.

Однако я хочу добавить возможность group(g1) добавлять разные groups(g2-3) в свой список, чтобы в результате запрос выдавал ВСЕ members(M1)+(m2-3).

Мои таблицы:

Group(1) Table:  Group1, 
Member(2) table: MemberA, MemberB, MemberC etc.

Я думаю, мне нужен какой-то тип таблицы ссылок, где group(1) вводит, что он хочет подписаться на член Group(2).

Я думал, что таблица ссылок будет выглядеть так:

GroupID,  Group Name,GroupID, GROUP subscribed to Name 
Group(1), FancyGroup(1), Group(2), shabby Group(2) 

Вот как я хочу, чтобы результаты запроса Group(1) выглядели после подписки на Group(2):

Fancy Group
Fancy MemberA
Fancy MemberB
Fancy MemberC
Shabby  MemberA
Shabby Member B

Есть идеи? Я понимаю, что это длинный вопрос, но я не знал более короткого способа исправить это?

ОБНОВЛЕНИЕ 3/9:

Это мои имена таблиц:

Группа называется family; Строки (userid,loginName..etc)
Группа участников называется member; строки (memberid,loginName,name, и т.д.)
Таблица соединения называется user2member; строки (userid,memberid) .

Это то, что я использую для запроса:

SELECT member.name
   FROM family
      JOIN user2member on family.userid = member.memberid
      JOIN member on user2member.name = member.name
     WHERE family.userid = '30'
   ORDER BY member.name

Я получаю эту ошибку: ~...syntax to use near 'Â WHERE family.userid = '30' ORDER BY member.name LIMIT 0, 30' at line 5

Идеи?


person Michael Robinson    schedule 06.03.2010    source источник


Ответы (1)


Я думаю, вы пытаетесь представить отношения «многие ко многим» между группами и членами.

Для этого вам понадобится групповая таблица со строкой для каждой группы. GroupID, GroupName, что угодно, что угодно.

Вам нужна таблица участников со строкой для каждого человека. MemberID, Имя, Фамилия, что угодно, что угодно.

Затем вам понадобится таблица соединений, таблица группового членства. Простейшая таблица членства в группах имеет такие строки

идентификатор участника, идентификатор группы

Он имеет одну строку на члена в каждой группе. Вы можете добавить в эту таблицу другие элементы, если они нужны вашему приложению, например DateJoined или ActiveMembership или что-то еще.

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

SELECT m.Firstname, m.Lastname
  FROM group g
  JOIN groupmembership gm on g.GroupID = gm.GroupID
  JOIN member m on gm.MemberID = m.MemberID
 WHERE g.GroupName = 'geeks'
ORDER BY m.Lastname, m.Firstname

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

SELECT m.Firstname, m.Lastname
  FROM member m
  LEFT JOIN groupmembership gm on m.MemberID = gm.MemberID
 WHERE gm.GroupID IS NULL
ORDER BY m.Lastname, m.Firstname

Это супер-полезный шаблон дизайна. Удачи.

person O. Jones    schedule 06.03.2010
comment
Я добавил правильные имена групп и имена участников. Я запутался. Я также вставил ваш запрос с моими переменными. Я получаю этот код: ОШИБКА 1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «JOIN user2member gm на g.memberid = gm.userid  JOIN member m на gm.name = m» в строке 3 - person Michael Robinson; 07.03.2010
comment
Я разместил новый вопрос, используя ваш ответ ... Думаю, я на правильном пути. Я считаю, что новый вопрос лучше сформулирован. Спасибо за вашу помощь. - person Michael Robinson; 10.03.2010
comment
вы правы, я на самом деле не проверял этот материал, извините за это. Разве 1064 не отличное сообщение об ошибке? - person O. Jones; 11.03.2010