【问题标题】:MariaDB ignores ORDER BY in SELECTMariaDB 忽略 SELECT 中的 ORDER BY
【发布时间】:2021-10-01 03:16:36
【问题描述】:

我安装了新版本的 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 表中的条目顺序,按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 升序排序。

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

【问题讨论】:

    标签: php mysql mariadb


    【解决方案1】:

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

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

    MariaDB query test here

    【讨论】:

    • 非常感谢!您的解决方案解决了我的问题。你的回答帮助我找到更多关于 ROW NUMBER 函数的信息,它可以在子查询中替换 ORDER BY
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多