用户函数的mariadb顺序给出了错误的结果

时间:2016-03-01 02:02:56

标签: mysql sql sql-order-by mariadb sql-function

使用MySQL / 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作为我的开发平台。

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

非常欢迎任何帮助。

Guylain Plante

2 个答案:

答案 0 :(得分:0)

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

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;

答案 1 :(得分:0)

最后,我记得我必须放置一个LIMIT(以及一个子查询),以便数据库有充分的理由应用排序顺序。

以下查询现在正常工作:

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