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
设置为 name
和 id
,但结果是一样的。似乎填满偶数的 col ord2
总是按 id
升序排序。
我应该如何重写查询或脚本来解决问题?
在最新的 MariaDB 版本中,您可以通过以下方式使用 window 函数 row_number:
select
id,
(row_number() over (order by ord))*2 ard2,
name,
parent
from tbl;
我安装了新版本的 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
设置为 name
和 id
,但结果是一样的。似乎填满偶数的 col ord2
总是按 id
升序排序。
我应该如何重写查询或脚本来解决问题?
在最新的 MariaDB 版本中,您可以通过以下方式使用 window 函数 row_number:
select
id,
(row_number() over (order by ord))*2 ard2,
name,
parent
from tbl;