Вставить в несколько вариантов выбора из разных таблиц - PullRequest
1 голос
/ 25 июня 2019

У меня есть таблицы users (id, email), permissions (id, description) и users_permissions (user_id, permission_id, created) со многими ко многим.

Мне нужно выбрать пользователя с каким-то адресом электронной почты и назначить ему все разрешения из таблицы permissions, которых у него нет.

Теперь я пытаюсь назначить хотя бы все разрешения, но получаю ошибку

Подзапрос возвращает более 1 строки

Мой запрос:

insert into `users_permissions` (`user_id`, `permission_id`, `created`)
    select 
        (select `id` from `users` where `email` = 'user-abuser@gmail.com') as `user_id`,
        (select `id` from `permissions`) as `permission_id`,
        now() as `created`;

1 Ответ

2 голосов
/ 25 июня 2019

Если подзапрос (внутри SELECT) возвращает более одной строки, MySQL это не понравится.

Другой способ выполнить ваше требование - использовать CROSS JOIN между производными таблицами (подзапрос в предложении FROM):

INSERT INTO `users_permissions` (`user_id`, `permission_id`, `created`)
    SELECT 
      u.id, 
      p.id, 
      NOW() 
    FROM 
      users AS u 
    CROSS JOIN permissions AS p 
    WHERE u.email = 'user-abuser@gmail.com'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...