【问题标题】:How do I select a value I've inserted above, in the same query?如何在同一个查询中选择我在上面插入的值?
【发布时间】:2019-04-06 23:16:49
【问题描述】:

我正在创建一个存储过程来生成属性调查。
它首先接收property id 输入。
然后,它会在我的survey 表中插入一个新调查,其中包含自动递增的survey id,以及相应的property id 输入。

最后,该过程执行一系列选择和连接,并检索与相关property 中的property type 关联的所有questions
这不是相关部分,因为它运行完美且顺利。

因此,在此之前,我的存储过程插入了调查,并显示了一个表格,其中有一列 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 ;

问题在于,除了显示的问题之外,我现在还想显示所述问题所属的调查 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 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 表的自动递增主键。

那么我如何保持我的程序的能力:

  • 插入调查
  • 显示调查问题

并使其能够同时显示调查的 ID 以及问题?

我正在使用 Uwamp 和 MySQL Workbench 6.2.5。

谢谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    假设survey.idAUTO INCREMENT 列,您可以使用LAST_INSERT_ID() 获取其值。无需争论,

    LAST_INSERT_ID() 返回一个 BIGINT UNSIGNED(64 位)值,表示作为最近执行的 INSERT 语句的结果为 AUTO_INCREMENT 列成功插入的第一个自动生成的值。

    所以你可以改变

    SELECT survey.id AS 'Survey ID',
    

    SELECT LAST_INSERT_ID() AS 'Survey ID',
    

    获取survey.id的最后一个值。

    【讨论】:

      【解决方案2】:

      它抱怨的原因是没有survey 可以在您的第二个查询中引用,您只有subqueryproperty。您可以使用一个巧妙的技巧来实际获取最后插入的行的 ID: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 ;
      

      你应该很高兴。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-20
        • 2013-11-23
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        相关资源
        最近更新 更多