Для написания запроса для трех связанных таблиц (many-to-many), мы должны использовать операторы JOIN и условия для соединения таблиц.
Возьмем, например, три таблицы: users
, roles
и user_roles
.
Таблица users
содержит информацию о пользователях:
users +----+----------+-------+ | id | username | email | +----+----------+-------+ | 1 | John | [email protected] | | 2 | Alice | [email protected] | +----+----------+-------+
Таблица roles
содержит информацию о ролях:
roles +----+---------+ | id | name | +----+---------+ | 1 | Admin | | 2 | User | +----+---------+
Таблица user_roles
представляет связь между пользователем и его ролями:
user_roles +----+---------+----------+ | id | user_id | role_id | +----+---------+----------+ | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 2 | +----+---------+----------+
Теперь, чтобы написать запрос, который вернет информацию о пользователях, их ролях и соответствующих названиях ролей, мы будем использовать операторы JOIN и условие ON для связывания таблиц:
SELECT users.username, roles.name FROM users INNER JOIN user_roles ON users.id = user_roles.user_id INNER JOIN roles ON user_roles.role_id = roles.id;
Этот запрос выполнит следующие действия:
1. Выберет только нужные столбцы из таблицы пользователей (users.username
) и столбца названия ролей (roles.name
).
2. Использует оператор JOIN для объединения таблиц users
и user_roles
по условию, что user_roles.user_id
равно users.id
.
3. Использует оператор JOIN для объединения таблиц user_roles
и roles
по условию, что user_roles.role_id
равно roles.id
.
Ожидаемый результат будет следующим:
+----------+-------+ | username | name | +----------+-------+ | John | Admin | | John | User | | Alice | User | +----------+-------+
Этот запрос вернет список всех пользователей и их соответствующих ролей в одной таблице. Если у пользователя есть несколько ролей, он будет представлен в нескольких строках с разными названиями ролей.