MariaDB 忽略 SELECT 中的 ORDER BY

MariaDB ignores ORDER BY in SELECT

我安装了新版本的 MariaDB,排序时遇到问题 php-script:

$this->db->query("
    SET @v:=0;
    UPDATE `users` AS `c1`
    LEFT JOIN (SELECT `id`, (@v:=@v+2) AS `ord2`, `name`, `parent` 
    FROM `users` 
    WHERE `parent`='0' ORDER BY `ord` ASC) AS `c2`
    ON `c1`.`id` = `c2`.`id`
    SET `c1`.`ord` = `c2`.`ord2`
    WHERE `c1`.`parent` = '0'
");

特别是脚本设置 users table 中的条目顺序 ord:

+----+-----+--------------------+--------+
| id | ord | name               | parent |
+----+-----+--------------------+--------+
|  2 |   2 | admin              |      0 |
| 10 |   5 | manager            |      0 |
| 12 |   7 | user               |      0 |
| 11 |   9 | dev                |      0 |
+----+-----+--------------------+--------+

我不熟悉 SQL,经过长时间的搜索和测试,在我看来,我发现 SQL-查询不正确:

SELECT `id`, (@v:=@v+2) AS `ord2`, `name`, `parent` 
FROM `users` 
WHERE `parent`='0' ORDER BY `ord` ASC;

在以前版本的 MariaDB (5.5.5-10.1.25) 中,查询给出了按初始顺序排序的条目 (ord):

+----+-----+--------------------+--------+
| id | ord2| name               | parent |
+----+-----+--------------------+--------+
|  2 |   2 | admin              |      0 |
| 10 |   4 | manager            |      0 |
| 12 |   6 | user               |      0 |
| 11 |   8 | dev                |      0 |
+----+-----+--------------------+--------+

在新版本 (10.6.3) 中结果是:

+----+-----+--------------------+--------+
| id | ord2| name               | parent |
+----+-----+--------------------+--------+
|  2 |   2 | admin              |      0 |
| 10 |   4 | manager            |      0 |
| 12 |   8 | user               |      0 |
| 11 |   6 | dev                |      0 |
+----+-----+--------------------+--------+

我尝试将 ORDER BY param ord 设置为 nameid,但结果是一样的。似乎填满偶数的 col ord2 总是按 id 升序排序。

我应该如何重写查询或脚本来解决问题?

在最新的 MariaDB 版本中,您可以通过以下方式使用 window 函数 row_number:

select 
    id,
    (row_number() over (order by ord))*2 ard2,
    name,
    parent
from tbl;

MariaDB query test here