MariaDB的顺序给出错误的结果

问题描述:

使用MySQL/MariaDB的,我通常做这种查询下面获取特定记录的排名,这样我可以在应用程序中显示正确的页面:MariaDB的顺序给出错误的结果

SET @rownum := 0; 
SELECT rank 
    FROM 
     (SELECT @rownum := @rownum+1 AS rank, ordid 
      FROM ord 
      order by ord_status, ordid 
    ) AS derived_table 
    WHERE ordid = 1234 
    limit 1; 

我用了它多年,它通常工作得很好。

然而,今天,我想根据订单的状态,而不是订单状态ID(场ord_status)的描述的查询进行排序。所以,我必须使用我在数据库中创建的名为getStatusDescription()的用户函数对数据进行排序。这是我的新查询:

SET @rownum := 0; 
SELECT rank 
    FROM 
     (SELECT @rownum := @rownum+1 AS rank, ordid 
      FROM ord 
      order by getStatusDescription(ord_status), ordid 
    ) AS derived_table 
    WHERE ordid = 1234 
    limit 1; 

由于未知的原因,排名结果是错误的,我不明白为什么它不起作用。 MariaDB有可能存在问题或限制吗?

我CentOS的7台机器上使用MariaDB的10.0.17作为我的开发plaftform。

为了您的信息,我的函数getStatusDescription()只是接收一个参数(订单状态ID),然后根据收到的参数从特定表中选择适当的varchar(35)字段,然后将其返回。

任何帮助是非常欢迎。

Guylain普兰特

+0

可能相关:https://mariadb.com/kb/en/mariadb/group-by -trick-已-被优化的折叠/ –

你获得排名的方法是好的,但你也可以使用子查询方法:

select count(*) 
from ord cross join 
    (select ordid, getStatusDescription(o2.ord_status) as gsd 
     from ord o2 
     where o2.ordid = 1234 
    ) oo 
where getStatusDescription(ord_status) < oo.gsd or 
     (getStatusDescription(ord_status) = oo.gsd and o.ordid <= oo.ordid) 

至于你的情况,我不知道的根本原因。然而,有时GROUP BY是有问题与变量和一个额外的子查询可修复万阿英,蒋达清:

SELECT rank 
FROM (SELECT @rownum := @rownum+1 AS rank, ordid 
     FROM (SELECT ord.* 
      FROM ord 
      ORDER BY getStatusDescription(ord_status), ordid 
      ) derived_table CROSS JOIN 
      (SELECT @rownum := 0) params 
    ) o 
WHERE ordid = 1234 
LIMIT 1; 

最后,我想起我不得不把上限(也一个子查询),使得数据库中有一个很好的理由应用排序顺序。

下面的查询工作,现在罚款:

SELECT rank FROM (SELECT @rownum := @rownum+1 AS rank, ordid 
        FROM (SELECT ordid FROM ord order by getStatusDescription(ord_status), ordid LIMIT 9999999999999 
         ) as t2 
       ) AS derived_table 
WHERE ordid = 1234 limit 1; 

请参见下面的线程,以及: mysql - order by inside subquery