Отношения многие ко многим, используя соединения - PullRequest
0 голосов
/ 10 марта 2010

У меня есть база данных, две таблицы и таблица ссылок, для которой мне нужен запрос JOIN:

Вот мои таблицы:

семейство (ИД пользователя (int), логин и т. Д.)
member (memberid (int), loginName (связывает члена с семьей), имя и т. д.)

Таблица связывания: user2member (userid, memberid) ... оба будут внешними ключами?

Я хочу сделать две вещи:

1) Иметь возможность, чтобы family.loginName (12, Джонсон) подписывался на другой family.loginName (43, Смит) и записывал это в таблицу ссылок.

Это будет выглядеть так: 12,43

2) Когда я сделаю запрос для всех member.name, которые входят в семью Johnson, я получу всех Johnsons & all the Smiths.

Если Джонсон = Тед, Сью и Пэтти ЕСЛИ Смит = Джо, Сью и Боб

мой результат запроса будет теперь Джонсоном = Тед, Сью, Патти, Джо, Сью, Боб

Я задал этот вопрос несколько дней назад без хороших имен таблиц, и я в итоге запутал себя и симпатичного парня Олли Джонса, который отправил ответ, похожий на этот, для запроса:

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

Мне пришлось изменить ответ Олли, чтобы он соответствовал моим таблицам, но я получаю предельную ошибку 0,30 в строке 5.

Я впервые играю в JOINS, и я понятия не имею, верно ли это.

Спасибо

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

1 Ответ

1 голос
/ 10 марта 2010

Я не уверен, что предложенные вами таблицы решат вашу проблему. Если я правильно понимаю ваш вопрос, есть два отношения:

  • отношения для всех членов семьи (Джонсон с Тедом, Сью, Пэтти, Смит с Джо, Сью, Боб)
  • отношение для подписок (семья может подписаться на другую семью)

Я бы предложил следующие таблицы:

  • семейство (f_id, f_loginName и т. Д.)
  • член (m_id, m_f_id, m_name) (внешний ключ к семье, отношение многие-к-одному)
  • подписка (s_f_id, s_to_f_id) (связывание основано на ключах обоих семейств)

Это приведет к следующему содержанию:

family:
f_id   f_loginName
12     Johnson
43     Smith

member:
m_id   m_f_id   m_name
1      12       Ted
2      12       Sue
3      12       Patty
4      43       Joe
5      43       Sue
6      43       Bob

subscription
s_f_id s_to_f_id
12     43

Теперь, чтобы получить все возможные члены для определенного семейства и его подписок, я бы использовал следующий SQL-запрос. У этого есть простое соединение для семьи, и это - члены семьи. В предложении WHERE выбирается семейство Johnson (f_id = 12), и для получения всех членов семейства из подписок проще использовать подзапрос.

SELECT f_loginName, m_name 
FROM family
INNER JOIN member ON m_f_id = f_id
WHERE f_id = 12 
      OR f_id IN (SELECT s_to_f_id FROM subscription WHERE s_f_id = 12) 
ORDER BY f_loginName, m_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...