Как дублировать запись, которая появляется меньше раз, чем это необходимо? Ошибка: "Подзапрос возвращает более одной записи"
Имеется БД с таблицами items, users и orders. Из таблиц users и items необходимо выбрать значения из стобца id (при условии, что логин в users – john, а категория в items – hats).
Для решения задания написал запрос.
INSERT INTO orders (user_id, item_id) VALUES
((SELECT id FROM users WHERE `login` = 'john'),
(SELECT id FROM items WHERE `category` = 'hats'))
Результат: ошибка #1242 - Подзапрос возвращает более одной записи. Понимаю, что john-ов для всех hat-ов не хватает, однако не могу придумать, как сделать так, чтобы id john-а каким-либо образом подставлялся сам, ведь логины уникальны.
Ответы (1 шт):
. Понимаю, что john-ов для всех hat-ов не хватает, однако не могу придумать, как сделать так, чтобы id john-а каким-либо образом подставлялся сам, ведь логины уникальны.
Судя по описанию, у вас одна запись из юзеров, и N записей из items подходящих под условие. Ваша форма запроса INSERT предполагает вставку одной строки в таблицу. И поскольку в items у вас строк несколько, вы получаете соответствующую ошибку.
Чтобы вставить несколько строк в используйте форму запроса INSERT ... SELECT. А чтобы получить все подходящие строки, используйте JOIN.
INSERT INTO order (user_id, item_id)
SELECT u.id, i.id
FROM users AS u
INNER JOIN items AS i ON (i.category = 'hats')
WHERE u = 'John'
либо подзапрос
INSERT ...
SELECT
(select id from users where name = 'John')
, i.id
FROM items AS i
WHERE category = 'hats'