MariaDB/MySQL 使用更新内部加入 MariaDB 是错误的顺序,但在 MySQL 中是正确的

Posted

技术标签:

【中文标题】MariaDB/MySQL 使用更新内部加入 MariaDB 是错误的顺序,但在 MySQL 中是正确的【英文标题】:MariaDB/MySQL using update inner Join MariaDB is wrong order but correct in MySQL 【发布时间】:2021-04-23 12:21:14 【问题描述】:

想在下面寻求您的帮助:

我要更新表lessons中的lessonnumber,逻辑是lessonnumber将根据starttime按顺序列出更新。我下面的 laravel 代码在 mysql 中工作,但在 MariaDB 中出现错误顺序。

php
DB::statement('set @i=0;');
$type_id = 2;   //lessons type
    
DB::update("
    UPDATE lessons A 
    INNER JOIN (SELECT * FROM lessons WHERE lessons.type_id = $type_id ORDER BY lessons.starttime ASC LIMIT 30) B
    ON  B.id = A.id
    SET A.lessonnumber = (select @i:=@i+1)
");
id lessonnumber startime
1 1 11
2 3 33
3 2 22
4 4 44
5 5 55

Mysql:第1 3 2 4 5课是正确的顺序

id lessonnumber startime
1 1 11
2 2 33
3 3 22
4 4 44
5 5 55

MariaDB:课程编号 1 2 3 4 5 是错误顺序

谁能帮助解决我的问题?提前感谢您的帮助

【问题讨论】:

你使用的是什么版本的 mariadb? 了解 sql 注入以及准备和绑定查询的重要性 @P.Salmon MariaDB 10.3.27 版,很有帮助,谢谢 您不需要在 INNER JOIN 中使用子查询。如果顺序很重要,您需要反转连接或至少将您的顺序子句放在主查询级别。 使用@变量,即使今天正确,明天也可能不正确。您必须切换到 MySQL 8 或 MariaDB 10.2 中的窗口函数才能获得可预测的结果。 【参考方案1】:

您正在加入 id,因此连接查询中的排序将被忽略。使用 order by 的正确更新形式是 https://dev.mysql.com/doc/refman/8.0/en/update.html

SET @I = 0;
UPDATE LESSONS A 
    SET A.lessonnumber = (select @i:=@i+1)
WHERE TYPE_ID = 2
ORDER BY STARTTIME;

【讨论】:

这真的有效!!很有帮助,非常感谢!

以上是关于MariaDB/MySQL 使用更新内部加入 MariaDB 是错误的顺序,但在 MySQL 中是正确的的主要内容,如果未能解决你的问题,请参考以下文章

条件更新 MariaDB (MySQL)

Homebrew Mariadb Mysql 安装 root 访问被拒绝

在centos上创建MariaDB/Mysql主从(Master/Slave)

5分钟了解与部署mariaDB(mysql)主从复制

LAMP

MySQL 使用 MAX 日期更新内部联接