我在 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/