MySQL: вставьте новую запись, используя значение MAX столбца в той же таблице

Мне нужно 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

Подсказка: вставить в x(a,b,c) выбрать a,b,c из y; - но обратите внимание на обычные предостережения о хранении производных данных

Strawberry 15.03.2019 09:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
157
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите использовать подзапрос во вставке, вам не нужно использовать 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);

Привет! Это тот же самый запрос, который я разместил, не работает.

Andres SK 15.03.2019 14:40

Другие вопросы по теме