Как выбрать значение, которое я вставил выше, в том же запросе?

Я создаю хранимую процедуру для создания опроса по свойству.
Сначала он получает ввод property id.
Затем он вставляет новый опрос в мою survey таблицу с автоматически увеличивающимся survey id и соответствующим вводом property id.

Наконец, процедура выполняет серию операций выбора и объединения и извлекает все questions, которые связаны с property type рассматриваемого property.
Это не важная часть, так как она работает идеально и гладко.

Итак, раньше моя хранимая процедура вставляла опрос и показывала таблицу с одним столбцом question_description со всеми вопросами для опроса этого свойства в своих строках. Вот этот код:

DELIMITER //
CREATE PROCEDURE GenerateSurvey (IN input INT)
BEGIN

    INSERT INTO survey (property_id, cas_eval_id, checksum_xxx)
    VALUES
    (input, 'CAS-XXX-YYYY', 123);

    SELECT subquery.question_description
    FROM (
    SELECT question.question_description,
    property_type_question.property_type_id
    FROM property_type_question
    JOIN question
    ON property_type_question.question_id = question.id
    ORDER BY question.id
    ) AS subquery
    JOIN property
    ON subquery.property_type_id = property.property_type_id
    WHERE property.id = input;
END //
DELIMITER ;

Проблема в том, что вместе с показанными вопросами я теперь хочу показать идентификатор опроса, к которому относятся указанные вопросы. Итак, чтобы сделать это, я пытаюсь сделать это:

DELIMITER //
CREATE PROCEDURE GenerateSurvey (IN input INT)
BEGIN
    INSERT INTO survey (property_id, cas_eval_id, checksum_xxx)
    VALUES
    (input, 'CAS-XXX-YYYY', 123);

    SELECT survey.id AS 'Survey ID',
    subquery.question_description
    FROM (
    SELECT question.question_description,
    property_type_question.property_type_id
    FROM property_type_question
    JOIN question
    ON property_type_question.question_id = question.id
    ORDER BY question.id
    ) AS subquery
    JOIN property
    ON subquery.property_type_id = property.property_type_id
    WHERE property.id = input;
END //
DELIMITER ;

Это дает мне следующую ошибку: Как выбрать значение, которое я вставил выше, в том же запросе?

Итак, MySQL не распознает survey.id.
Но survey.id существует. Он просто вставляется в тот же запрос, что и выше, и просто не отображается в коде, потому что это автоматически увеличивающийся первичный ключ для моей таблицы survey.

Итак, как мне сохранить способности моей процедуры:

  • Вставка опроса
  • Отображение вопросов опроса

И добавить возможность отображать идентификатор опроса вместе с вопросами?

Я использую Uwamp и MySQL Workbench 6.2.5.

Спасибо!

Один из этих ответов решил вашу проблему? Если нет, не могли бы вы предоставить больше информации, чтобы помочь ответить на него? В противном случае, пожалуйста, подумайте о том, чтобы отметить принятый ответ, который лучше всего решил вашу проблему (галочка под стрелками вверх/вниз). См. stackoverflow.com/help/someone-answers

Nick 12.04.2019 11:37
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Причина, по которой он жалуется, заключается в том, что в вашем втором запросе нет survey, на который он может ссылаться, у вас есть только subquery и property. Есть хитрый трюк, который вы можете сделать, чтобы фактически получить идентификатор последней вставленной строки: LAST_INSERT_ID(). Поэтому просто перепишите свою процедуру следующим образом:

DELIMITER //
CREATE PROCEDURE GenerateSurvey (IN input INT)
BEGIN
    INSERT INTO survey (property_id, cas_eval_id, checksum_xxx)
    VALUES
    (input, 'CAS-XXX-YYYY', 123);

    SELECT LAST_INSERT_ID() AS 'Survey ID',
    subquery.question_description
    FROM (
    SELECT question.question_description,
    property_type_question.property_type_id
    FROM property_type_question
    JOIN question
    ON property_type_question.question_id = question.id
    ORDER BY question.id
    ) AS subquery
    JOIN property
    ON subquery.property_type_id = property.property_type_id
    WHERE property.id = input;
END //
DELIMITER ;

И тебе должно быть хорошо идти.

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

Предполагая, что survey.id является столбцом AUTO INCREMENT, вы можете использовать LAST_INSERT_ID() для получения его значения. Без аргументов,

LAST_INSERT_ID() returns a BIGINT UNSIGNED (64-bit) value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement.

Таким образом, вы можете просто изменить

SELECT survey.id AS 'Survey ID',

к

SELECT LAST_INSERT_ID() AS 'Survey ID',

Чтобы получить последнее значение survey.id.

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