MySQL错误: operand should contain 1 column(s) on simple update query

标签 mysql sql

我在 MySQL 中有一个存储过程,它应该根据条件更新名为“task”的表的值。问题出在下面一行

UPDATE task SET validity = 1 WHERE id = _task_id;

此查询不执行任何操作,尽管在本例中它有效:

UPDATE task SET validity = NULL WHERE id = _task_id;

从 PHP 页面调用时执行存储过程,并且我确信所有 IN 参数都是有效的,因为该过程的其他行都正确执行。

这是“任务”表的定义:

  CREATE TABLE task(
  id INT AUTO_INCREMENT NOT NULL,
  camp_id INT NOT NULL,
  heading VARCHAR(200) NOT NULL UNIQUE,
  description VARCHAR(300) NOT NULL,
  validity INT(1),
  PRIMARY KEY(id),
  CONSTRAINT task_fk
  FOREIGN KEY(camp_id) REFERENCES work_campaign(id)
  ON DELETE CASCADE
) ENGINE = InnoDB;

存储过程:

    DELIMITER //

    DROP PROCEDURE IF EXISTS define_task_result;
    CREATE PROCEDURE define_task_result(IN _task_id INT, IN count_answers INT)
    BEGIN
      DECLARE _camp_id INT;
      DECLARE _validity_threshold INT;
      DECLARE count_answer_options INT;
      DECLARE counter INT unsigned;
      DECLARE _option VARCHAR(100);
      DECLARE _percentage INT;
      DECLARE max_percentage INT;
      DECLARE selected_option_number INT;
      DECLARE check_max_number INT;


      SET _camp_id = (SELECT camp_id FROM task WHERE id = _task_id);
      SET _validity_threshold = (SELECT validity_threshold FROM work_campaign WHERE id = _camp_id);
      SET counter = 0;

      DROP TABLE IF EXISTS options_percentage;
      CREATE TABLE options_percentage (
       opt VARCHAR(100),
       percentage INT DEFAULT 0
      );

      INSERT INTO options_percentage(opt)
      SELECT answer_option FROM task_answers_options WHERE task_id = _task_id;

      SET count_answer_options = (SELECT COUNT(*) FROM options_percentage);

      WHILE counter < count_answer_options DO
        SET _option = (SELECT opt FROM options_percentage LIMIT counter,1);
        SET selected_option_number = (SELECT COUNT(*) FROM task_worker_answers WHERE answer = _option);
        SET _percentage = (selected_option_number / count_answers) * 100;
        UPDATE options_percentage SET percentage = _percentage WHERE opt = _option;
        SET counter = counter + 1;
      END WHILE;

  SET check_max_number = (SELECT COUNT(*) FROM options_percentage WHERE percentage = (SELECT MAX(percentage) FROM options_percentage));

  IF check_max_number > 1 THEN
    UPDATE task SET validity = NULL WHERE id = _task_id;
  ELSE
    SET max_percentage = (SELECT percentage FROM options_percentage WHERE percentage = (SELECT MAX(percentage) FROM options_percentage LIMIT 1));

    IF max_percentage >= _validity_threshold THEN
      UPDATE task SET validity = 1 WHERE id = _task_id;
    ELSE
      UPDATE task SET validity = NULL WHERE id = _task_id;
    END IF;
  END IF;


    END //

    DELIMITER ;

当我尝试从命令行调用相同的查询时,出现以下错误 - 操作数应包含 1 列。我真的看不出解决的方法..

最佳答案

您有一个查询调用返回多个值。

就是这里的这个。它位于 ELSE 语句的顶部,其中包含原始问题中的“问题行”。

SET max_percentage = (SELECT percentage FROM options_percentage WHERE percentage = (SELECT MAX(percentage) FROM options_percentage));

说明如下

从 options_percentage 中选择最大值(百分比)

这很好,它只会返回一个值。

从 options_percentage 中选择百分比,其中百分比 = {标量}

这并不总是有效。当出现多个百分比匹配时会发生什么?

您可以在 SQL Server 中使用 TOP 来限制结果。其他 RMDB 也有类似的功能,您可以查找。我相信 MySQL 的等价物是 LIMIT,它位于 SELECT 语句 的末尾。希望有帮助。

针对您的问题更新8/31

这就是你目前拥有的 (从 options_percentage LIMIT 1 中选择 MAX(百分比)))

需要变成这样 (从 options_percentage 中选择最大值(百分比))LIMIT 1)

目前,您正在LIMIT“良好”查询,而不是有问题的查询。

因此,上述更改的完整内容如下:

SET max_percentage = (SELECT percentage FROM options_percentage WHERE percentage = (SELECT MAX(percentage) FROM options_percentage) LIMIT 1);

关于MySQL错误: operand should contain 1 column(s) on simple update query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52119764/

相关文章:

mysql - 如何删除数据透视表中的空值?

mysql - MySQL 可以在开发计算机上本地设置吗?

php - 在准备好的语句 PDO PHP 中绑定(bind)值数组

c# - 返回类型数组

sql - 生成用于数据库测试的 SQL 语句

php - 选择使用双引号字符串时,mysql 上出现错误 1064 <42000>

mysql - 我如何解决旧版本 MySQL 中缺少 where-clause 子查询的问题?

mysql - 将负值插入mysql数据库?

sql - 如何选择 col1 值 x 并复制到 col1 值 y 的新行,如果再次运行查询,不应再次复制

mysql - 将表数据关联并求和作为摘要