mysql - MySQL变量分配通过过程不正常工作
问题描述
在下面的代码中,我尝试endDateTable
逐行查看结果,将当前行endDate
与前一行的endDate
. 如果自上次以来有任何变化,我们增加@revisionNum
. 但是,在填充新表时,所有@revisionNum
条目都是0
. 我究竟做错了什么?
注意:我以这种方式使用准备好的语句,因为直接SELECT
进入变量会导致语法错误,因为LIMIT
在我们的 MySQL 版本中该子句不允许变量。
BEGIN
DECLARE _currentEndDate DATETIME DEFAULT now();
DECLARE _priorEndDate DATETIME DEFAULT now();
SET @ResultsCount = (SELECT COUNT(*) FROM mainTable);
SET @j = 0;
WHILE @j < @ResultsCount DO
SET @revisionNum = 0;
/*CURRENT END DATE*/
SET @appResultQueryCurrent = CONCAT('
SELECT
end_date
INTO _currentEndDate
FROM endDateTable
LIMIT ', @j, ', 1'
);
PREPARE currentQueryStmt FROM @appResultQueryCurrent;
EXECUTE currentQueryStmt;
/*PREVIOUS END DATE*/
SET @appResultQueryPrior = CONCAT('
SELECT
end_date
INTO _priorAppEndDate
FROM endDateTable
LIMIT ', IF(@j = 0, 0, @j - 1), ', 1'
);
PREPARE priorQueryStmt FROM @appResultQueryPrior;
EXECUTE priorQueryStmt;
SET @revisionNum = IF(
@j = 0 OR (_currentEndDate = _priorEndDate),
@revisionNum,
IF(
_currentEndDate != _priorEndDate,
@revisionNum + 1,
@revisionNum
)
);
INSERT INTO finalTable (RevisionNum)
SELECT
@revisionNum AS RevisionNum
FROM endDateTable;
SET @j = @j +1;
END WHILE;
END $$
解决方案
您不需要循环,您可以使用INSERT INTO ... SELECT ...
,增加选择查询中的变量。
您还需要一个ORDER BY
标准来指定在将一行与前一行进行比较时如何对行进行排序。
INSERT INTO finalTable (RevisionNum, otherColumn)
SELECT revision, otherColumn
FROM (
SELECT IF(end_date = @prev_end_date, @revision, @revision := @revision + 1) AS revision,
@prev_end_date := end_date,
otherColumn
FROM endDateTable
CROSS JOIN (SELECT @prev_end_date := NULL, @revision := -1) AS vars
ORDER BY id) AS x
推荐阅读
- vb.net - 不知何故,如果我的 VB.net 应用程序无法在组合框列表索引中运行,我就无法退出
- c# - OnCollisionEnter 在应该被调用的时候没有被调用
- sql - 如何将水晶报表代码中的If语句转换为SQL case语句
- c - 自定义 WM_APP 消息未发布在消息队列中
- python - 如何解决jupyter notebook中“启动内核失败”的问题
- amazon-web-services - AWS ECS 最近创建的实例没有配置 ssh authorized_keys
- python-3.x - 如何在python中同步两个音频文件?
- mysql - MySQL ")" 在这个位置无效,需要一个标识符
- java - 多对多关系上的 PostgreSQL 约束冲突错误,但应存在外键
- go - 符文与字节范围在字符串上