Терминология
Ваша терминология кажется правильной - «многие ко многим», часто записываемые как «многие: многие» с двоеточием. Иногда средняя таблица (band_members) называется «таблицей мостов».
Вероятно, вы можете отбросить band_members.id
, поскольку два внешних ключа также составляют составной первичный ключ (и первичный ключ фактически может быть определен таким образом, поскольку обычно пользователь не может быть членом одного и того же диапазона дважды. Единственное исключение из этого - если пользователь может иметь более одной роли в одном и том же диапазоне).
Решение
На первый взгляд это звучит просто - мы можем видеть взаимосвязи таблиц, и обычно между ними просто используется INNER JOIN
. Есть три таблицы, так что это будет два объединения.
Однако сначала мы должны правильно концептуализировать проблему. Проблема заключается в том, что соединение между пользователями и участниками группы (идентификатор пользователя) на самом деле должно использоваться для двух вещей:
- какой пользователь в какой группе
- фильтрация по пользователю
Итак, для этого нам нужно ввести одну таблицу с несколькими целями:
SELECT
Users.first_name, Users.last_name
FROM Users
INNER JOIN Band_Members Band_Members1 ON (Band_Members1.user_id = Users.Id)
INNER JOIN Band_Members Band_Members2 ON (Band_Members1.band_id = Band_Members2.band_id)
WHERE
Band_Members2.user_id = 1
Здесь вы можете видеть, что я присоединился к Band_Members
дважды, и когда это произойдет , нужно называть их по-разному, чтобы на них можно было ссылаться отдельно. Первый экземпляр выполняет очевидное соединение между таблицей Users и таблицей моста, а второй устанавливает связь между «Users, которые находятся в Bands» и «Bands, в которых я нахожусь».
Конечно, это Решение требует, чтобы вы знали свой идентификатор пользователя. Если бы вы хотели выполнить аналогичный запрос, но с фильтром на основе вашего имени, тогда вам пришлось бы присоединиться к другой (с измененным псевдонимом) копии таблицы User, чтобы вы могли различать две разные цели: «Пользователи, которые являются в бэндах "и" ваш Пользователь ".