当一个变量具有一个值,另一个变量具有多个值时,如何将两个变量插入表中?

时间:2019-04-17 17:37:52

标签: mysql sql

以供将来参考:
在我的数据库中,所有关联实体中都带有“ $”字符。
例如,“ 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表中时,此错误在存储过程的最后一次INSERT发生。

由于@last_survey_id包含一个调查ID,但是@survey_questions包含多个问题ID,因此返回错误。

我想在survey$question$answer表中插入多行。

每行应具有相同的survey_id(存储在@last_survey_id中),但每一行应具有不同的question_id值(存储在@survey_questions中)。

例如:
如果对于ID为2的调查,属于ID为4、5和6的问题,我希望它看起来像这样:

survey_id | question_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 | question_id
    3 | 10
    3 | 20
    3 | 30
    3 | 40
    3 | 50

那么我该如何遍历@survey_questions中的所有值,并为每个不同的值插入一行,然后同时为每一行插入相同的值(在@last_survey_id中)?

如果我将它们分开做,会更好吗?
也许首先插入所有question_id,然后更新各行以为每行包含相同的survey_id?我在弄清楚我将如何执行此操作时遇到了麻烦...

谢谢!

1 个答案:

答案 0 :(得分:1)

我怀疑生成错误是因为您尝试将多个值存储在一个标量变量中。您可以直接将查询结果插入表中,而不必使用变量@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;