MariaDB ROW_NUMBER 与 ORDER BY 未正确排序

Posted

技术标签:

【中文标题】MariaDB ROW_NUMBER 与 ORDER BY 未正确排序【英文标题】:MariaDB ROW_NUMBER with ORDER BY not ordering correctly 【发布时间】:2021-04-06 00:46:37 【问题描述】:

我设置了一个简单的查询来让我的菜单项按相应的语言消息内容排序,但奇怪的是,这并没有正确设置行号。这是查询:

SET @idx = 0;
SELECT (@idx:=@idx + 1) AS neworderindex, a.id, a.messagecontent FROM (
    SELECT m.id, l.messagecontent
    FROM app_menuitem m 
    INNER JOIN app_language l ON m.id = l.messagekey AND l.locale = 'it'
    WHERE m.parent_id = 'some.parent.id'
    ORDER BY l.messagecontent
) a;

我尝试先执行子查询,结果排序正确,我只是不知道@idx 变量发生了什么。

【问题讨论】:

您必须在执行计算的级别上指定排序 - 即在外部查询中,而不是在子查询中。 @Akina 我已经尝试过了,但是 neworderindex 仍然不正确。 提供一些示例数据和所需结果的小提琴。 您运行的是哪个版本的 MariaDB? @GMB 10.5.8-MariaDB-1:10.5.8+maria~focal 【参考方案1】:

使用窗口函数:

SELECT ROW_NUMBER() OVER (ORDER BY l.messagecontent) as neworderindex,
       m.id, l.messagecontent
FROM app_menuitem m INNER JOIN
     app_language l
     ON m.id = l.messagekey AND l.locale = 'it'
WHERE m.parent_id = 'some.parent.id'
ORDER BY l.messagecontent;

此功能于 2016 年随 MariaDB 10.2.0 一起发布。

【讨论】:

谢谢你,就像一个魅力!我可能错过了更新:)

以上是关于MariaDB ROW_NUMBER 与 ORDER BY 未正确排序的主要内容,如果未能解决你的问题,请参考以下文章

在 MariaDB 中使用 ROW_NUMBER() 函数的问题

ROW_NUMBER()在查询业绩排名中的使用

sql2000不支持Row_Number() over吗

PhpMyAdmin - 导出与查询结果不同

在 MariaDB 中,如何从表中选择前 10 行?

SQL Recursive:获取孩子的父值