#mysql #sql #subquery
#mysql #sql #подзапрос
Вопрос:
У меня есть 3 таблицы:
- Пользователи
- роли
- users_roles («мостовая таблица»)
Я пытаюсь выполнить этот запрос:
INSERT INTO `db`.`users_roles` (`user_id`, `role_id`)
VALUES ((SELECT id FROM `db`.`users` WHERE username like '%@gmail.com'), (Select id from roles where authority="can_view"));
Поскольку существуют сотни user_id
с именем пользователя, например%gmail.com , я получаю сообщение об ошибке «Подзапрос возвращает более 1 строки«. Кроме того, существует только один орган управления, поэтому я использовал оператор = . Я знаю, что должен использовать IN
оператор при работе с несколькими значениями, но, похоже, я не знаю, как правильно написать этот запрос с первым SELECT
.
Как я могу решить эту проблему? Помогите!
Комментарии:
1. Похоже, вы пытаетесь выполнить два отдельных запроса, один для user_id и один для role_id. Поскольку они не объединены, они могут иметь разное количество результатов. А что произойдет, если вы вернете 30 идентификаторов пользователя, но получите только 15 идентификаторов роли? Он не знает, как это сопоставить. Вам нужно объединить ваши таблицы, чтобы получить единый набор результатов для вашей вставки.
Ответ №1:
Просто используйте insert . . . select
:
INSERT INTO db.users_roles (user_id, role_id)
SELECT u.id, r.id
FROM db.users u JOIN
roles r
ON u.username like '%@gmail.com' AND
r.authority = 'can_view';
Комментарии:
1. Привет!! Я выполнил этот запрос, и я получаю эту ошибку «Количество столбцов не соответствует количеству значений в строке 1»
2. ВСТАВИТЬ В db.users_roles (user_id, role_id) ВЫБЕРИТЕ u.id ,r.id ИЗ базы данных.пользователи u ПРИСОЕДИНЯЮТСЯ к ролям r НА u.имя пользователя, например ‘%@gmail.com ‘ И r.authority = ‘can_view’;
Ответ №2:
Похоже, вы пытаетесь предоставить can_view
разрешение существующим пользователям с учетной записью gmail. Если это так, вам не нужно выбирать из roles
таблицы. Просто запустите roles
запрос таблицы, чтобы получить идентификатор can_view
разрешения, а затем вы можете просто жестко запрограммировать его в запросе следующим образом:
INSERT INTO db.users_roles (user_id, role_id) SELECT id, RoleIDFromPreviousQueryHere FROM db.users WHERE username like '%@gmail.com'