Как написать запрос для трёх связанных таблиц (many-to-many)?

Для написания запроса для трех связанных таблиц (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  |
+----------+-------+

Этот запрос вернет список всех пользователей и их соответствующих ролей в одной таблице. Если у пользователя есть несколько ролей, он будет представлен в нескольких строках с разными названиями ролей.