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 中是正确的的主要内容,如果未能解决你的问题,请参考以下文章
Homebrew Mariadb Mysql 安装 root 访问被拒绝