Мне нужно INSERT создать новую запись, используя MAX значение столбца position плюс один во вновь вставленной строке. Поэтому, если значение MAX равно 14, значение столбца позиции следующей вставленной строки должно быть 15.
Это мой текущий код, который работает, но ему нужны 2 отдельных запроса:
# get position order
$sql = 'SELECT MAX(position) FROM store_item_photo WHERE id_item = 3';
$stmt = cnn()->prepare($sql);
$stmt->execute();
$position = $stmt->fetchColumn();
$position++;
# photo: new record
$sql = 'INSERT INTO store_item_photo (id_item, position) VALUES (3, :position)';
$stmt = cnn()->prepare($sql);
$stmt->bindValue(':position', $position, PDO::PARAM_INT);
$stmt->execute();
Я хотел знать, есть ли способ добиться того же результата всего одним запросом:
# photo: new record (one query)
$sql = 'INSERT INTO store_item_photo (id_item, position) VALUES (3, (SELECT MAX(position) FROM store_item_photo WHERE id_item = 3) + 1)';
$stmt = cnn()->prepare($sql);
$stmt->execute();
Этот тест выдает ошибку. Можно ли добиться этого с помощью аналогичного подхода?
Я построил схему в sqlfiddle: http://sqlfiddle.com/#!9/228058/1






Если вы хотите использовать подзапрос во вставке, вам не нужно использовать VALUES
Попробуйте этот запрос:
INSERT INTO store_item_photo (id_item, position)
SELECT
3 AS id_item,
MAX(position) + 1
FROM store_item_photo
WHERE id_item = 3;
Попробуйте этот запрос:
$sql = 'INSERT INTO store_item_photo (id_item, position) VALUES (3, ((SELECT MAX(position) FROM store_item_photo WHERE id_item = 3) + 1))';
$stmt = cnn()->query($sql);Привет! Это тот же самый запрос, который я разместил, не работает.
Подсказка: вставить в x(a,b,c) выбрать a,b,c из y; - но обратите внимание на обычные предостережения о хранении производных данных