Как вставить две переменные в таблицу, если одна имеет одно значение, а другая имеет несколько значений? - PullRequest
1 голос
/ 17 апреля 2019

Для дальнейшего использования:
В моей базе данных все ассоциативные объекты содержат символ "$".
Например, таблица "property_type $ question" связывает мою таблицу "property_type" и мою таблицу "question".

Я создаю эту хранимую процедуру для создания опросов для данного свойства:

/*---------- PROCEDURE TO GENERATE SURVEY FOR A PROPERTY ----------*/
        DELIMITER //
        CREATE PROCEDURE GenerateSurvey (IN input_property_id INT)
        BEGIN
            INSERT INTO survey (checksum_xxx, cas_id)
            VALUES
            (123, 'CAS-XXX-YYYY');

            SELECT LAST_INSERT_ID() INTO @last_survey_id;

            INSERT INTO property$survey (property_id, survey_id)
            VALUES
            (input_property_id, @last_survey_id);

            SELECT property_type$question.question_id
            INTO @survey_questions
            FROM (
                SELECT property.id AS 'property_id',
                property_type.id AS 'property_type_id'
                FROM property JOIN property_type
                ON property.property_type_id = property_type.id
                WHERE property.id = input_property_id
            ) AS subquery join property_type$question
            ON subquery.property_type_id = property_type$question.property_type_id
            WHERE subquery.property_id = input_property_id;

            INSERT INTO survey$question$answer (survey_id, question_id)
            VALUES
            (@last_survey_id, @survey_questions);
        END //
        DELIMITER ;

Я получаю эту ошибку:
enter image description here

Я подозреваю, что эта ошибка происходит при последней вставке моей хранимой процедуры при вставке в таблицу survey$question$answer.

Возвращает ошибку, поскольку @last_survey_id содержит один идентификатор опроса, а @survey_questions содержит несколько идентификаторов вопросов.

Я хочу вставить несколько строк в таблицу survey$question$answer.

Каждая строка должна иметь одинаковый survey_id (хранится в @last_survey_id), но каждая строка должна иметь различное значение для question_id (хранится в @survey_questions).

Например:
Если опросу с идентификатором 2 принадлежат вопросы с идентификаторами 4, 5 и 6, я бы хотел, чтобы он выглядел следующим образом:

survey_id |вопрос_ид
2 |4
2 |5
2 |6

Однако не в каждом опросе содержится одинаковое количество вопросов.Это означает, что я не могу использовать вставку в формате:

INSERT INTO survey$question$answer (survey_id, question_id)
VALUES
    (@last_survey_id, @survey_questions);
    (@last_survey_id, @survey_questions);
    (@last_survey_id, @survey_questions);

, потому что нет никакого способа узнать, сколько вопросов будет иметь опрос.

Таким образом, опрос 3 может иметьвопросы 10, 20, 30, 40 и 50.
Это должно привести к:

survey_id |вопрос_ид
3 |10
3 |20
3 |30
3 |40
3 |50

Итак, как мне пройти все значения в @survey_questions и вставить строку для каждого отдельного значения, а затем одновременно вставить одно и то же значение (в @last_survey_id) для каждой строки?

Будет ли это работать лучше, если я просто сделаю их отдельно?
Может быть, сначала вставьте все question_id с, а затем обновите строки, включив в них одинаковые survey_id для каждой строки?Мне трудно понять, как бы я это сделал ...

Спасибо!

1 Ответ

1 голос
/ 17 апреля 2019

Я подозреваю, что ошибка генерируется, потому что вы пытаетесь сохранить несколько значений в одной скалярной переменной.Вместо использования переменной @survey_questions для извлечения можно напрямую вставить результат запроса в таблицу.

Удалите последние SELECT и последние INSERT и вставьте:

INSERT INTO survey$question$answer
            (survey_id,
             question_id)
            SELECT @last_survey_id,
                   property_type$question.question_id
                   FROM (SELECT property.id property_id,
                                property_type.id property_type_id
                                FROM property
                                     INNER JOIN property_type
                                                ON property.property_type_id = property_type.id
                                WHERE property.id = input_property_id) subquery
                        INNER JOIN property_type$question
                                   ON subquery.property_type_id = property_type$question.property_type_id
                        WHERE subquery.property_id = input_property_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...